Signor
Signor

Reputation: 563

How to insert new lines after a specific empty line in linux?

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

Upvotes: 1

Views: 99

Answers (1)

Shawn
Shawn

Reputation: 52334

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.

Upvotes: 1

Related Questions