我想查找兩個單詞之間出現的文本,而這兩個單詞不在同一行,兩者都出現在不同的行上,所以我想查找介於兩行之間的行(文本行)也就是說如何獲取文本文件中兩個單詞之間的文本行?
例如:
This is an example
first
second
third
vs.
fourth
所以我想找到first
和「與」之間的文本話。
我該如何使用sed命令來獲取?
我想查找兩個單詞之間出現的文本,而這兩個單詞不在同一行,兩者都出現在不同的行上,所以我想查找介於兩行之間的行(文本行)也就是說如何獲取文本文件中兩個單詞之間的文本行?
例如:
This is an example
first
second
third
vs.
fourth
所以我想找到first
和「與」之間的文本話。
我該如何使用sed命令來獲取?
您可以使用範圍模式:打印
~$ sed -n '/first/,/vs/p' f
first
second
third
vs.
一切和vs
之間first
(p
),其他一切都是不-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
如果匹配則跳過first
或vs
,否則打印。
匹配vs
後的第一個 「選擇」 之後結束,你就必須退出(q
):
~$ sed -n '/first/,/vs/p;/vs/q' f f
或
~$ sed -n '
/first/,/vs./ {
/first/n
/vs/q
p
}
' f f
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
的意思是「如果最後嘗試的比賽沒有成功,則打印」。在這種情況下,轉換爲:「如果此行不是圖案範圍邊框,請將其打印出來。」
如何使用上述正則表達式不區分大小寫? –
是的。分別使用'/ first/I'和'/ vs/I q'來代替'/ first /'和'/ vs/q'。 – Wintermute
感謝您的幫助:) –