I want to insert a # at the beginning of each line within a file. But only to those lines between a section:
################## PATTERN #1 ##############
blah 1243234
blah asdfsyxfvb
blah asdfasdfg
################## PATTERN #2 ##############
-->
################## PATTERN #1 ##############
#blah 1243234
#blah asdfsyxfvb
#blah asdfasdfg
################## PATTERN #2 ##############
I got it almost with my limited knowledge about awk and sed. But I'm struggling to merge the output into my file.
awk '/################## PATTERN #1/{flag=1;next}/################## PATTERN #2/{flag=0}flag' myinputfile | sed 's/^/#/'
Thanks in advance for helping me out.
P. S. As I'm new here: If someone has an idea for a better title/tags please let me know and I will change it.
CodePudding user response:
This might be what you want:
$ awk '/PATTERN #2/{f=0} f{$0="#" $0} /PATTERN #1/{f=1} 1' file
################## PATTERN #1 ##############
#blah 1243234
#blah asdfsyxfvb
#blah asdfasdfg
################## PATTERN #2 ##############
Obviously adjust the "pattern" delimiters to be whatever you want.
CodePudding user response:
Assuming the second pattern always exists, a sed one-liner might do the job:
sed '/PATTERN #1/,/PATTERN #2/s/^/#/' file
CodePudding user response:
Your code might be reworked to do what you wants. Lets file.txt content be
################## PATTERN #1 ##############
blah 1243234
blah asdfsyxfvb
blah asdfasdfg
################## PATTERN #2 ##############
then
awk '/################## PATTERN #1/{flag=1;print;next}/################## PATTERN #2/{flag=0;print;next}{print (flag?"#":"") $0}' file.txt
output
################## PATTERN #1 ##############
#blah 1243234
#blah asdfsyxfvb
#blah asdfasdfg
################## PATTERN #2 ##############
Explanation: for line with PATTERN #1 set flag to 0, print line, go to next line, for line with PATTERN #2 set flag to 1, print line, go to next line, for every other line if flag is true (1) then prepend line with # and print, if flag is false (0) then prepend line with empty string (i.e. do not change) and print. I used ternary operator (condition?valueiftrue:valueiffalse) to select string suitable to flag value
(tested in gawk 4.2.1)
CodePudding user response:
This might work for you (GNU sed):
sed '/PATTERN #1/{:a;N;/PATTERN #2/!ba;s/^[^#]\?/#&/mg}' file
Gather up lines between PATTERN #1 and PATTERN #2 and insert # at the front of lines that do not have them.
N.B. This will only update a file if both patterns are present.
To amend the least lines between PATTERN #1 and PATTERN #2 i.e. PATTERN #1 occurs again before PATTERN #2 the lines from the first occurrence of PATTERN #1 will not be commented, use:
sed '/PATTERN #1/{:a;N;/\n.*PATTERN #1/{h;s/\(.*\)\n.*/\1/p;g;s/.*\n//;ba}
/PATTERN #2/!ba;s/^[^#]\?/#&/mg}' file
