malmo
malmo

Reputation: 524

delete a line after a pattern only if it is blank using sed or awk

I want to delete a blank line only if this one is after the line of my pattern using sed or awk for example if I have

G

O TO P999-ERREUR

END-IF.

the pattern in this case is G I want to have this output

 G
 O TO P999-ERREUR

 END-IF.

Upvotes: 3

Views: 3734

Answers (4)

kenorb
kenorb

Reputation: 166309

Using ex (edit in-place):

ex +'/G/j' -cwq foo.txt 

or print to the standard output (from file or stdin):

ex -s +'/GG/j|%p|q!' file_or_/dev/stdin

where:

  • /GG/j - joins the next line when the pattern is found
  • %p - prints the buffer
  • q! - quits

For conditional checking (if there is a blank line), try:

ex -s +'%s/^\(G\)\n/\1/' +'%p|q!' file_or_/dev/stdin

Upvotes: 1

Chris Seymour
Chris Seymour

Reputation: 85765

This will do the trick:

$ awk -v n=-2 'NR==n+1 && !NF{next} /G/ {n=NR}1' file
G
O TO P999-ERREUR

END-IF.

Explanation:

-v n=-2    # Set n=-2 before the script is run to avoid not printing the first line
NR == n+1  # If the current line number is equal to the matching line + 1
&& !NF     # And the line is empty 
{next}     # Skip the line (don't print it)
/G/        # The regular expression to match
{n = NR}   # Save the current line number in the variable n
1          # Truthy value used a shorthand to print every (non skipped) line

Upvotes: 9

potong
potong

Reputation: 58361

This might work for you (GNU sed):

sed -r 'N;s/(G.*)\n\s*$/\1/;P;D' file

Keep a moving window of two lines throughout the length of the file and remove a newline (and any whitespace) if it follows the intended pattern.

Upvotes: 1

123
123

Reputation: 11216

Using sed

sed '/GG/{N;s/\n$//}' file

If it sees GG, gets the next line, removes the newline between them if the next line is empty.


Note this will only remove one blank line after, and the line must be blank i.e not spaces or tabs.

Upvotes: 6

Related Questions