使用awk更改与分隔符之间的模式匹配的行

时间:2011-05-19 23:00:15

标签: awk delimiter substitution

我有一个这样的输入文件:

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'

我不确定的是如何返回并用新内容替换分隔部分。有任何想法吗?单线的奖励积分。

3 个答案:

答案 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

第二个范围模式是打印范围之外的其他行(由前导'!'指定)(我现在没有办法测试它,所以尝试移动'!'如果它不能像这样工作)

我希望这会有所帮助。