如何在文本文件中的两个单词之间获取文本行?

时间:2015-01-07 09:28:10

标签: sed

我想找到两个单词之间的文本,这两个单词不在同一行,两个都出现在不同的行上,所以我想找到进来的行(文本行)在单词之间

例如:

This is an example
first

second
third
vs.

fourth

所以我想找到first和'vs.'之间的文字话。
如何使用sed命令获取此信息?

2 个答案:

答案 0 :(得分:1)

您可以使用范围模式:

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

second
third
vs.

firstvs之间的所有内容都打印出来(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

如果匹配firstvs则跳过,否则打印。


要在第一个"选择"之后结束,您只需在匹配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表示"如果最后一次尝试的匹配没有成功,请打印。"在这种情况下,转换为:"如果此行不是图案范围边框,则打印它。"