我有一个这样的输入文件:
some line
some other line
another line
start_delimiter
interesting stuff
more interesting stuff
even more interesting stuff
end_delimiter
possibly more stuff
我想操纵start_delimiter和end_delimiter之间与正则表达式匹配的行,并将结果写入输入文件。例如,将'//'添加到包含单词'more'的行的开头(只要这些行在分隔符之间):
some line
some other line
another line
start_delimiter
interesting stuff
//more interesting stuff
//even more interesting stuff
end_delimiter
possibly more stuff
我可以通过这种方式在分隔符之间获取文本部分:
awk '/start_delimiter/,/end_delimiter/' inputfile
如果我将其传输到另一个awk,我可以更改我感兴趣的行:
awk '/more/ {sub(/^/,"//")}1'
我不确定的是如何返回并用新内容替换分隔部分。有任何想法吗?单线的奖励积分。
答案 0 :(得分:9)
/start_delimiter/ {inblock=1}
/end_delimiter/ {inblock=0;}
{ if (inblock==1 && (/more/)) { print "//" $0 } else print $0}
答案 1 :(得分:6)
对于一个队员狂热分子:
awk '/^(start_delim|end_delim)/{f=f?0:1}f&&/more/{$0="//" $0}1' file
添加了行^
锚点的开头,以避免在块分隔符嵌入到行的中间时出现混淆。
答案 2 :(得分:1)
你需要像
这样的东西awk '/start_delimiter/,/end_delimiter/{
if ($0 ~ /^more/ ) { print "//" $0 }
else print $0
}
!/start_delimiter/,/end_delimiter/ print $0' inputfile
第二个范围模式是打印范围之外的其他行(由前导'!'指定)(我现在没有办法测试它,所以尝试移动'!'如果它不能像这样工作)
我希望这会有所帮助。