Выполняйте оставшиеся команды только в случае совпадения с предыдущим - PullRequest
0 голосов
/ 04 мая 2018

Есть ли способ указать sed не запускать оставшиеся команды для строк, которые не соответствуют предыдущим командам?

Вот пример:

sed -rn '/^pT_yy +/{s/[^ ]+ +//;s/ +/,/g;p}'

Я бы хотел сопоставить ^pT_yy + и заменить его за один раз, без дублирования кода для сопоставления и замены.

у меня изначально было

sed -rn 's/^pT_yy +//;s/ +/,/gp'

но при этом выводятся строки, которые не начинаются с ^pT_yy +, как если бы они прошли через sed -r 's/ +/,/', и я вообще не хочу этих строк.

1 Ответ

0 голосов
/ 04 мая 2018

См. Команду тестирования:

t метка (тест) Ветвь к метке, только если был успешный подстановка с момента считывания последней строки ввода или условного перехода был взят. Метка может быть опущена, в этом случае следующий цикл начал.

Документация .

Пример (пропустить вторую, если 1-я команда не выполнена):

sed 's/e/1/;!t;s/t/2/g' <<< "test string"

Печать:

21s2 s2ring

Выполняет вторую замену, поскольку первая удаётся.

Если вы отмените условие (пропустите второе, если первое выполнится успешно):

sed 's/e/1/;t;s/t/2/g' <<< "test string"

Он печатает:

t1st string

здесь она пропустила вторую, потому что первая команда прошла успешно.

...