Bash - Sed несколько команд в одной строке
Игра с sed - команды ниже делают то, что требуется, но один лайнер будет лучше. Я попытался объединить первые две команды (с разделителем ';'), чтобы удалить завершающий символ ':', но безуспешно. В противном случае прибегают к удалению последнего символа ":" и записи в новый файл для выполнения следующей операции.
Файл 'sys' с одной строкой, содержащей переменное число символов и разделитель ':'. Например;
Ввод - первая строка 'sys' 3.000000:50:
желаемый результат, две переменные thd=3 mem=50
thd=$(echo | sed 's/.......:.*//' < sys)
sed 's/:$//' < sys > sys1
mem=$(echo | sed 's|........:||' < sys1)
Есть ли способ объединить первые две команды sed, чтобы избежать записи второго файла? Я пробовал это различными способами
Примерно так - РЕДАКТИРОВАТЬ: это неправильный порядок удаления трейлинга ':'
thd=$(echo | sed 's/:$//;s/.......:.*//' < sys)
mem=$(echo | sed 's|........:||' < sys1)
Выход 3 50:
с разделителем.
РЕДАКТИРОВАТЬ: Это правильный порядок и производит желаемый результат. Bash не сохраняет результат первой операции в файле sys. Который я должен был поднять в 3 лайнера.
thd=$(echo | sed 's/.......:.*//' < sys)
mem=$(echo | sed 's|........:||;s/:$//' < sys)
2 ответа
Если вам нужно, чтобы двум переменным присваивались значения независимо друг от друга: первая содержит число перед точкой, а вторая - число между двоеточиями, вы можете использовать такой подход, как
thd=$(cut -f1 -d. < sys)
mem=$(cut -f2 -d: < sys)
Назначение обоих одновременно также возможно:
read thd mem < <(tr "." ":" < sys | cut -f1,3 -d: --output-delimiter=" ")
Попробуй это:
$ echo '3.000000:50:' | { IFS='.:' read thd x mem; echo "'$thd' '$mem'"; }
'3' '50'
Или это:
$ sys='3.000000:50:'; IFS='.:' read thd x mem <<< "$sys"; echo "'$thd' '$mem'"
'3' '50'
Вышеуказанное устанавливает переменную dont care x
, Если вам это не нравится, вы можете назначить mem
дважды.
$ sys='3.000000:50:'; IFS='.:' read thd mem mem <<< "$sys"; echo "'$thd' '$mem'"
'3' '50'