excluding first and last lines from sed /START/,/END/

后端 未结 5 1351
轮回少年
轮回少年 2020-12-24 01:18

Consider the input:

=sec1=
some-line
some-other-line

foo
bar=baz

=sec2=
c=baz

If I wish to process only =sec1= I can for example comment

相关标签:
5条回答
  • 2020-12-24 01:23

    This should do the trick:

    sed -e '/=sec1=/,/=sec2=/ { /=sec1=/b; /=sec2=/b; s/^/#/ }' < input
    

    This matches between sec1 and sec2 inclusively and then just skips the first and last line with the b command. This leaves the desired lines between sec1 and sec2 (exclusive), and the s command adds the comment sign.

    Unfortunately, you do need to repeat the regexps for matching the delimiters. As far as I know there's no better way to do this. At least you can keep the regexps clean, even though they're used twice.

    This is adapted from the SED FAQ: How do I address all the lines between RE1 and RE2, excluding the lines themselves?

    0 讨论(0)
  • 2020-12-24 01:31

    Another way would be

    sed '/begin/,/end/ {
           /begin/n
           /end/ !p
         }'
    

    /begin/n -> skip over the line that has the "begin" pattern
    /end/ !p -> print all lines that don't have the "end" pattern

    Taken from Bruce Barnett's sed tutorial http://www.grymoire.com/Unix/Sed.html#toc-uh-35a

    0 讨论(0)
  • 2020-12-24 01:38

    you could also use awk

    awk '/sec1/{f=1;print;next}f && !/sec2/{ $0="#"$0}/sec2/{f=0}1' file
    
    0 讨论(0)
  • 2020-12-24 01:39

    I've used:

    sed '/begin/,/end/{/begin\|end/!p}'
    

    This will search all the lines between the patterns, then print everything not containing the patterns

    0 讨论(0)
  • 2020-12-24 01:45

    If you're not interested in lines outside of the range, but just want the non-inclusive variant of the Iowa/Montana example from the question (which is what brought me here), you can write the "except for the first and last matching lines" clause easily enough with a second sed:

    sed -n '/PATTERN1/,/PATTERN2/p' < input | sed '1d;$d'

    Personally, I find this slightly clearer (albeit slower on large files) than the equivalent

    sed -n '1,/PATTERN1/d;/PATTERN2/q;p' < input

    0 讨论(0)
提交回复
热议问题