以下命令将从包含它的所有行13,14,15 ... 29中删除PATTERN:
sed -i 13,29s/PATTERN// file
但是,我想从第13行和第29行删除PATTERN。显然,我可以使用
sed -i 13s/PATTERN//;29s/PATTERN// file
但是我的模式足够长以使这不方便,所以我想只指定一次PATTERN。有任何想法吗?我试图寻找答案,但一无所获。
另外,有没有正确的理由为什么sed使用逗号而不是破折号来匹配一系列行?我发现它不合逻辑。
提前致谢。
答案 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提供使用变量的建议。