在regexp之间打印文本

时间:2010-07-11 22:18:01

标签: sed

我尝试了'/pat1/,/pat2/p',但我想只打印模式之间的文本,而不是整行。我该怎么做?

4 个答案:

答案 0 :(得分:4)

模式范围适用于多行模式。这就是你如何做到的:

sed  -n '/pat1/,/pat2/{/pat1\|pat2/!p}' inputfile
  • -n - 默认情况下不打印
  • /pat1/,/pat2/ - 在两种模式中包含
  • /pat1\|pat2/!p - 打印不是其中一种模式的所有内容

您可能要求的是同一行上两种模式之间的区别。其中一个答案就是这样做。

修改

几个例子:

$ 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

您可以通过告诉sed再次使用最新模式(//)来缩短它:

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

正如您所看到的,我没有必要在命令的第二部分复制长而复杂的正则表达式。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我不知道你使用的那种模式,但我认为使用正则表达式也是可能的。

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

答案 3 :(得分:0)

你可以使用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

该解决方案适用于跨越多行的模式