我想找到两个单词之间的文本,这两个单词不在同一行,两个都出现在不同的行上,所以我想找到进来的行(文本行)在单词之间
例如:
This is an example
first
second
third
vs.
fourth
所以我想找到first
和'vs.'之间的文字话。
如何使用sed命令获取此信息?
答案 0 :(得分:1)
您可以使用范围模式:
~$ sed -n '/first/,/vs/p' f
first
second
third
vs.
first
和vs
之间的所有内容都打印出来(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
则跳过,否则打印。
要在第一个"选择"之后结束,您只需在匹配q
后退出(vs
):
~$ sed -n '/first/,/vs/p;/vs/q' f f
或
~$ sed -n '
/first/,/vs./ {
/first/n
/vs/q
p
}
' f f
答案 1 :(得分: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
表示"如果最后一次尝试的匹配没有成功,请打印。"在这种情况下,转换为:"如果此行不是图案范围边框,则打印它。"