仅在匹配前执行剩余命令

时间:2018-05-04 04:48:30

标签: sed

有没有办法告诉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 :(得分:1)

请参阅测试命令:

  

t label(test)仅在成功时才转移到标签   自上次输入行读取或条件分支以来的替换   被拿走。标签可以省略,在这种情况下下一个循环是   启动。

Documentation

示例(如果第一个命令失败则跳过第二个):

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

这里跳过了第二个,因为第一个命令成功了。