通过将正则表达式与匹配的行替换为字符串

时间:2019-09-23 18:54:18

标签: regex sed replace

我从命令输出中得到了很多行。他们遵循以下模式:

payload
constant value(u) constant(u)
payload
constant value(u) constant(u)
payload

在此示例中,(u)是未知字符。

我关心的是“有效载荷”,因此我使用sed删除了“常数(u)常数(u)”行(通过保持第二行):

sed -n '1~2!p'

但是,有时会有重复的“ constant value(u)constant(u)”行,这使sed返回以下所有“ constant value(u)constant(u)”行,而不是“ payload”行行。

我可以使用正则表达式删除所有“常量(u)常量(u)”行:

sed '/^constant.*constant.*$/d'

但是问题在于,即使不是“ payload”行,我也必须知道该行在那里,所以我想用一些字符串替换此有问题的重复行的内容。我只想替换“问题”重复行。

因此,这是普通缝合中的示例输入:

after 1 hour
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
after 2 hours
Cras id consequat nisl.
after 2 hours
Etiam non metus eu velit maximus dapibus.
after 1 hour
Etiam a mi quis ante congue posuere.
after 5 hours
Suspendisse et venenatis ipsum, aliquet pharetra tortor.

这是一个“有问题的”输入:

after 1 hour
after 6 hours
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
after 2 hours
Cras id consequat nisl.
after 2 hours
Etiam non metus eu velit maximus dapibus.
after 1 hour
Etiam a mi quis ante congue posuere.
after 5 hours
Suspendisse et venenatis ipsum, aliquet pharetra tortor.

所需的输出(在上述输入有问题的情况下)为:

(no information)
after 6 hours
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
after 2 hours
Cras id consequat nisl.
after 2 hours
Etiam non metus eu velit maximus dapibus.
after 1 hour
Etiam a mi quis ante congue posuere.
after 5 hours
Suspendisse et venenatis ipsum, aliquet pharetra tortor.

如何以最有效的方式解决这个问题?我想我应该将“问题”行与正则表达式匹配,并用所需的字符串替换它们,但是如何?

2 个答案:

答案 0 :(得分:2)

此命令将找到以constant开头的连续两行,并将第二行替换为X

sed '/^constant.*$/ { N; s/\(^constant.*\n\)constant.*$/\1X/; }'

更新

根据您提供的其他信息,这应该可以解决问题:

sed '/^after .*$/ { N; s/^after .*\(\nafter .*\)$/(no information)\1/; }'

更新#2

@potong在评论中提供的另一种解决方案:

sed -E '/^after/{N;s/.*(\nafter)/(no information)\1/;P;D}'

这在行中多于2条“问题”行的情况下也将起作用,并将所有行替换为(no information)

答案 1 :(得分:0)

重复的行是否彼此相邻?如果是这样,只需先通过uniq运行文件