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'
Другие вопросы по тегам