Regular Expression over multiple lines

后端 未结 2 458
温柔的废话
温柔的废话 2020-12-08 05:18

I\'m stuck with this for several hours now and cycled through a wealth of different tools to get the job done. Without success. It would be fantastic, if someone could help

相关标签:
2条回答
  • 2020-12-08 05:55

    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 it
    D          # delete the first line of the pair (it's just been printed) and loop to the top
    ' inputfile
    
    0 讨论(0)
  • 2020-12-08 05:56

    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_csv
    don't touch this line
    don't touch this line either
    This is a long abstract describing something. What follows is the tile for this sentence."
    ,Title1
    seriously, don't touch this line
    This is another sentence that is running on one line. On the next line you can find the title.
    ,Title2
    also, don't touch this line
    

    Output

    $ sed 'N;/\n,/s/"\? *\n//;P;D' title_csv
    don't touch this line
    don't touch this line either
    This is a long abstract describing something. What follows is the tile for this sentence.,Title1
    seriously, don't touch this line
    This is another sentence that is running on one line. On the next line you can find the title.,Title2
    also, don't touch this line
    
    0 讨论(0)
提交回复
热议问题