Home > Software engineering >  How to insert new lines after a specific empty line in linux?
How to insert new lines after a specific empty line in linux?

Time:04-21

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.
  • Related