SED:从两个特定行中删除模式

时间:2015-08-19 00:17:53

标签: regex bash sed

以下命令将从包含它的所有行13,14,15 ... 29中删除PATTERN:

sed -i 13,29s/PATTERN// file

但是,我想从第13行和第29行删除PATTERN。显然,我可以使用

sed -i 13s/PATTERN//;29s/PATTERN// file

但是我的模式足够长以使这不方便,所以我想只指定一次PATTERN。有任何想法吗?我试图寻找答案,但一无所获。

另外,有没有正确的理由为什么sed使用逗号而不是破折号来匹配一系列行?我发现它不合逻辑。

提前致谢。

2 个答案:

答案 0 :(得分:2)

使用awk:

awk 'NR == 13 || NR == 29 { sub(/PATTERN/, "") } { print }' file

当然,你必须在这里使用awk兼容。 https://www.gnu.org/software/gawk/manual/html_node/Regexp.html#Regexp

第一部分达到了您的要求,第二部分只是打印出来。您可以使用重定向将内容放入另一个文件中,然后移动到原始位置。

答案 1 :(得分:0)

好的,以下可能是最接近我问题的答案:

sed -i '13,29{14,28!s/PATTERN//}' file

使用逻辑 - 或

进行更长时间的回答
sed -i '13bA;29bA;b;:A;s/PATTERN//' file

另外,使用变量:

VAR=PATTERN
sed -i "13s/$VAR//;29s/$VAR//" file

感谢@Jeff Bowman for redirection和@HuStmpHrrr提供使用变量的建议。