2010-07-11 33 views

回答

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 

由於你可以看到,我不必在命令的第二部分中複製冗長而複雜的正則表達式。

+0

嗯,這是否工作?我認爲它更適合替代'pat [12]'而不是使用'!p'。當然,如果我不誤解OP的要求。 :) – ghostdog74 2010-07-12 01:57:34

+0

@ ghostdog74:我認爲OP使用了錯誤的形式(我在答案中有一個)做他想做的事。我最後一段談到了這一點。你的回答解決了兩種形式。我會添加一個或兩個例子。 – 2010-07-12 02:46:00

+0

感謝您的編輯。什麼時候開始和結束模式恰好在同一行?例如'開始這是我想結束的文本'。雖然OP沒有顯示他的文件樣本,但我猜他可能在同一行上有兩種模式。 – ghostdog74 2010-07-12 04:12:22

0

我不知道你使用的模式的種類,但我認爲它也可以用正則表達式。

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

貓的無用用途。 – ghostdog74 2010-07-11 23:52:41

+2

沒有必要捕捉第一個和最後一個組。 – 2010-07-12 00:10:33

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 

的解決方案適用於跨越多行的

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

+1

您需要轉義括號或使用'-r'選項。 – 2010-07-12 00:11:54

+0

謝謝,編輯。 – Johnsyweb 2010-07-12 01:35:52