我尝试了'/pat1/,/pat2/p'
,但我想只打印模式之间的文本,而不是整行。我该怎么做?
答案 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
该解决方案适用于跨越多行的模式