Change lines that match a pattern in between delimiters using awk

假装没事ソ 提交于 2019-12-22 10:46:04

问题


I have an input file something like this:

some line
some other line
another line
start_delimiter
  interesting stuff
  more interesting stuff
  even more interesting stuff
end_delimiter
possibly more stuff

I want to manipulate the lines between start_delimiter and end_delimiter that match a regex pattern and write the results to the input file. For example, add '//' to the beginning of the lines containing the word 'more' (as long as those lines are between the delimiters):

some line
some other line
another line
start_delimiter
  interesting stuff
  //more interesting stuff
  //even more interesting stuff
end_delimiter
possibly more stuff

I can get the section of text between the delimiters this way:

awk '/start_delimiter/,/end_delimiter/' inputfile

If I pipe this to another awk I can change the lines I'm interested in:

awk '/more/ {sub(/^/,"//")}1'

What I'm not sure about is how to go back and replace the delimited section with the new contents. Any ideas? Bonus points for a one-liner.


回答1:


/start_delimiter/ {inblock=1}
/end_delimiter/ {inblock=0;}
{ if (inblock==1 && (/more/)) { print "//" $0 } else print $0}



回答2:


And for the one liners fanatics:

awk '/^(start_delim|end_delim)/{f=f?0:1}f&&/more/{$0="//" $0}1' file

Added the start of the line ^ anchor to avoid confusion if the block delimiter is embedded in the middle of a line.




回答3:


you need something like

awk '/start_delimiter/,/end_delimiter/{
  if ($0 ~ /^more/ ) { print "//" $0 } 
  else print $0
}
!/start_delimiter/,/end_delimiter/ print $0' inputfile

The 2nd range pattern is to get print the other lines, outside of the range (specified by the leading '!') (I didn't have a way to test that right now, so try moving the '!' around if it doesn't work like this)

I hope this helps.



来源:https://stackoverflow.com/questions/6065773/change-lines-that-match-a-pattern-in-between-delimiters-using-awk

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!