2015-01-07 110 views
-1

我想查找兩個單詞之間出現的文本,而這兩個單詞不在同一行,兩者都出現在不同的行上,所以我想查找介於兩行之間的行(文本行)也就是說如何獲取文本文件中兩個單詞之間的文本行?

例如:

This is an example 
first 

second 
third 
vs. 

fourth 

所以我想找到first和「與」之間的文本話。
我該如何使用sed命令來獲取?

回答

0

您可以使用範圍模式:打印

~$ sed -n '/first/,/vs/p' f 
first 

second 
third 
vs. 

一切和vs之間firstp),其他一切都是不-n

如果你不希望的模式:

~$ sed -n ' 
    /first/,/vs./ { 
     /first/n 
     /vs/ !p 
    } 
' f 

second 
third 

/first/n跳過那些具有第一線,和一切不符合vs,打印(!p
或者

~$ sed -n ' 
    /first/,/vs./ { 
     /first/n 
     /vs/n 
     p 
    } 
' f 

second 
third 

如果匹配則跳過firstvs,否則打印。


匹配vs後的第一個 「選擇」 之後結束,你就必須退出(q):

~$ sed -n '/first/,/vs/p;/vs/q' f f 

~$ sed -n ' 
    /first/,/vs./ { 
     /first/n 
     /vs/q 
     p 
    } 
' f f 
1
sed -n '/first/ { :loop; n; /vs/q; p; b loop }' filename 

即:

/first/ { # when you encounter a line that matches /first/ (contains it) 
    :loop  # in a loop: 
    n   # fetch the next line 
    /vs/q  # if it contains "vs", quit 
    p   # otherwise print it 
    b loop  # and loop. 
} 

優點是不需要指定兩次模式。要包含模式範圍邊界,使用

sed -n '/first/ { p; :loop; n; p; /vs/q; b loop }' filename 

順便說一句,如果你不是想只是第一場比賽,也將是一個極好的技巧擺脫起始和結束的模式範圍的線不重複你自己,這是

sed -n '/first/,/vs/ { //!p }' filename 

訣竅是,//重複上次嘗試匹配。在這種情況下,這是上次嘗試的模式範圍邊界 - /first/第一次和/vs/此後。 //!p的意思是「如果最後嘗試的比賽沒有成功,則打印」。在這種情況下,轉換爲:「如果此行不是圖案範圍邊框,請將其打印出來。」

+0

如何使用上述正則表達式不區分大小寫? –

+0

是的。分別使用'/ first/I'和'/ vs/I q'來代替'/ first /'和'/ vs/q'。 – Wintermute

+0

感謝您的幫助:) –

相關問題