Sed 如何获取文本文件中两个单词之间的文本行?
我想找到两个单词之间的文本,这两个单词不在同一行,都在不同的行上,所以我想找到两个单词之间的行(行中文本) 例如:Sed 如何获取文本文件中两个单词之间的文本行?,sed,Sed,我想找到两个单词之间的文本,这两个单词不在同一行,都在不同的行上,所以我想找到两个单词之间的行(行中文本) 例如: This is an example first second third vs. fourth 所以我想在first和'vs.'单词之间找到文本。 如何使用sed命令获取此信息 您可以使用范围模式: ~$ sed -n '/first/,/vs/p' f first second third vs. ~$ sed -n ' /first/,/vs./ {
This is an example
first
second
third
vs.
fourth
所以我想在first
和'vs.'单词之间找到文本。如何使用sed命令获取此信息 您可以使用范围模式:
~$ sed -n '/first/,/vs/p' f
first
second
third
vs.
~$ sed -n '
/first/,/vs./ {
/first/n
/vs/ !p
}
' f
second
third
第一个和第二个之间的所有内容都被打印(p
),其他所有内容都不是-n
如果您不想要这些图案:
~$ sed -n '/first/,/vs/p' f
first
second
third
vs.
~$ sed -n '
/first/,/vs./ {
/first/n
/vs/ !p
}
' f
second
third
/first/n
跳过具有first的行,对于与vs
不匹配的所有内容,打印(!p
)或 如果与
第一个
或vs
匹配,则跳过,否则打印
要在第一次“选择”后结束,只需在匹配
vs
后退出(q
):
~$ sed -n '/first/,/vs/p;/vs/q' f f
或
即:
/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/iq
而不是/first/
和/vs/q
。如果我想要从第一行到下一行的文本,并且vs下一行是\n,那么在上面的表达式中需要做哪些更改?您是指空行吗<代码>/^$/而不是/vs/
^
是行的开头,$
是行的结尾,因此如果行的开头紧跟着它的结尾,那么^$
匹配。空行出现在和之后,实际上我需要这样的模式来获取特定文本,并且在空行之后出现一些文本
sed -n '/first/,/vs/ { //!p }' filename