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