Dave Rove
Dave Rove

Reputation: 953

sed substitution including newlines

I want to change a text file so that any line beginning with "Length:" is appended to the previous line.

I'm aware that sed '/\nLength:/ Length:/' isn't going to work because sed is line based.

Googling for "How to match newlines in sed" did turn up a complex sed method for joining a pattern to the next line but I couldn't figure out how to adapt it.

Help would be appreciated.

Upvotes: 5

Views: 293

Answers (3)

potong
potong

Reputation: 58391

This might work for you (GNU sed):

sed 'N;/\nLength:/s/\n/ /;P;D' file

This appends the next line to the present line in the pattern space and if the appended line begins with the required string it replaces the newline with a space (if you do not want the space just replace the newline with nothing). The first line is then printed and deleted and the process repeated (the second line is now the first unless the condition was met in which case a line is automatically read in and then the first command appends the next).

Upvotes: 0

Casimir et Hippolyte
Casimir et Hippolyte

Reputation: 89557

If the file isn't too large, you can use a Perl command line in slurp mode (load all the file content before processing) :

perl -0777 -pe 's/\R(?=Length:)//g' file

-0777 switches on the slurp mode

pattern:

\R any kind of newlines

(?=...) lookahead assertion

If there's no consecutive lines starting with Length: you can use this sed command:

sed -n ':a;/\nLength:/!{$p;N;ba;}; s/\n\(Length:\)/$1/;p;' file

details:

:a;                  # define the label "a"
/\nLength:/! {       # if "\nLength:" doesn't match then:
    $p;              # if last line, print
    N;               # append the next line to the pattern space
    ba;              # go to label "a"
};
s/\n\(Length:\)/$1/; # perform the replacement
p;                   # print

An other way with awk using the record separator:

awk 'BEGIN{RS="\nLength:";ORS="Length:"}1' file | head -n -1

Upvotes: 2

Juan Diego Godoy Robles
Juan Diego Godoy Robles

Reputation: 14955

In awk you can use something like:

awk '/^/&&!/^Length/{printf "\n"}{printf "%s",$0}' infile

Will only print \n when line start ^ is matched. Exception: Length is found at that beginnig.

Upvotes: 2

Related Questions