I'm trying to find a way to insert a new line after a specific empty line.
for example I have a file contains firewall rules, and I want to insert new lines after "# ok icmp code for FORWARD
" and first empty line. (I don't know the exact line number and it is different in multiple machines):
...
# ok icmp code for FORWARD
-A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT
[Insert new lines here]
# new lines comment
new line 1
new line 2
...
here is my incomplete solution:
to find the specific line number:
cat file.rules | grep -n "ok icmp code for FORWARD" | cut -d':' -f 1
to show the lines after specific line and before the empty line:
awk '!NF{f=0} /ok icmp code for FORWARD/ {f=1} f' file.rules
CodePudding user response:
Using ed
to edit the file:
ed -s file.rules <<'EOF'
/^# ok icmp code for FORWARD/;/^$/a
# new lines comment
new line 1
new line 2
.
w
EOF
First sets the current line to the one matching # ok icmp code for FORWARD
, then advances the current line to the first blank line following that, and appends text after it (A line with a single period marks the end of input), then writes the changed file back to disk.
CodePudding user response:
Would you please try the following:
awk -v RS='' '/^# ok icmp code for FORWARD/ {print $0 "\n\n"; next} 1' file.rules
- If
RS
is set to the null string, then records are separated by blank lines. Then a record contains a block separated by an empty line. - If a record starts with
# ok icmp code for FORWARD
, extra newline characters are appended after printing the block. - Otherwise the script just prints the block due to the
1
at the end.