开发者

Printing text between regexps

I tried the '/pat1/,/pat2/p', but I want to print only the t开发者_C百科ext between the patterns, not the whole line. How do I do that?


A pattern range is for multiline patterns. This is how you'd do that:

sed  -n '/pat1/,/pat2/{/pat1\|pat2/!p}' inputfile
  • -n - don't print by default
  • /pat1/,/pat2/ - within the two patterns inclusive
  • /pat1\|pat2/!p - print everything that's not one of the patterns

What you may be asking for is what's between two patterns on the same line. One of the other answers will do that.

Edit:

A couple of examples:

$ cat file1
aaaa bbbb cccc
123 start 456
this is what
I want
789 end 000
xxxx yyyy zzzz
$ sed  -n '/start/,/end/{/start\|end/!p}' file1
this is what
I want

You can shorten it by telling sed to use the most recent pattern again (//):

$ sed  -n '/.*start.*/,/^[0-9]\{3\} end 0*$/{//!p}' file1
this is what
I want

As you can see, I didn't have to duplicate the long, complicated regex in the second part of the command.


sed -r 's/pat1(.*)pat2/\1/g' somefile.txt


I don't know the kind of pattern you used, but i think it is also possible with regular expressions.

cat myfile | sed -r 's/^(.*)pat1(.*)pat2(.*)$/\2/g'


you can use awk.

$ cat file
other TEXT
pat1  text  i want pat2
pat1 TEXT I
WANT
pat2
other text
$ awk -vRS="pat2" 'RT{gsub(/.*pat1/,"");print}' file
  text  i want
 TEXT I
WANT

The solution works for patterns that span multiple lines

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜