sed:如何匹配以word开头但不以另一个单词结尾的行

时间:2017-03-16 09:12:28

标签: sed

假设我想添加单词" end"以"开始"开头的每一行。但是,如果单词" end"已经走到了尽头;无需再次添加。那我怎么得到:

start line 1
start line 2 end
another line 3
start line 4

start line 1 end
start line 2 end
another line 3
start line 4 end

此命令匹配以" start"开头的行,但不排除以" end"结尾的行。如何在一行中获得同时执行这两种操作的正则表达式?

sed 's/\(^start.*\)/\1 end/g'

1 个答案:

答案 0 :(得分:1)

使用以下方法:

sed -i '/ end$/! s/^start .*$/& end/' testfile

-i选项允许修改文件到位

/ end$/! - 仅允许对那些不以' end'字结尾的行执行 next 操作(替换)

s/^start .*$/& end/ - 仅对以start

开头的那些行执行替换

如果您承认为您的案例使用其他好的替代方案的可能性,awk可能是其中之一:

awk '{print ($1 == "start" && $(NF) != "end") ? $0" end" : $0}' testfile

$1 - 指向第一个字段

$(NF) - 指向最后一个字段