Regular Expression over multiple lines Regular Expression over multiple lines bash bash

Regular Expression over multiple lines


Multiline in sed isn't necessarily tricky per se, it's just that it uses commands most people aren't familiar with and have certain side effects, like delimiting the current line from the next line with a '\n' when you use 'N' to append the next line to the pattern space.

Anyway, it's much easier if you match on a line that starts with a comma to decide whether or not to remove the newline, so that's what I did here:

sed 'N;/\n,/s/"\? *\n//;P;D' title_csv

Input

$ cat title_csvdon't touch this linedon't touch this line eitherThis is a long abstract describing something. What follows is the tile for this sentence.",Title1seriously, don't touch this lineThis is another sentence that is running on one line. On the next line you can find the title.,Title2also, don't touch this line

Output

$ sed 'N;/\n,/s/"\? *\n//;P;D' title_csvdon't touch this linedon't touch this line eitherThis is a long abstract describing something. What follows is the tile for this sentence.,Title1seriously, don't touch this lineThis is another sentence that is running on one line. On the next line you can find the title.,Title2also, don't touch this line


Yours works with a couple of small changes:

sed -n '1h;1!H;${;g;s/\."\?\n,//g;p;}' inputfile

The ? needs to be escaped and . doesn't match newlines.

Here's another way to do it which doesn't require using the hold space:

sed -n '${p;q};N;/\n,/{s/"\?\n//p;b};P;D' inputfile

Here is a commented version:

sed -n '$          # for the last input line{  p;             # print  q              # and quit};N;         # otherwise, append the next line/\n,/      # if it starts with a comma{  s/"\?\n//p;    # delete an optional comma and the newline and print the result  b              # branch to the end to read the next line};P;         # it doesn't start with a comma so print itD          # delete the first line of the pair (it's just been printed) and loop to the top' inputfile