我从命令输出中得到了很多行。他们遵循以下模式:
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.
如何以最有效的方式解决这个问题?我想我应该将“问题”行与正则表达式匹配,并用所需的字符串替换它们,但是如何?
答案 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运行文件