使用 sed 从文件中提取一行

使用 sed 从文件中提取一行

如何编写一个sed脚本来扫描输入文件中的“start”并找到包含“next”的行并显示以下行?像这样的东西:

[user]$ cat test.txt
start
next
This line should print
Ignore this


[user]$ display.sed test.txt
This line should print

[user]$ cat test1.txt
Ignore this
next
Ignore this
start
Ignore this
next
This line should print
Ignore this
next
Too late so ignore this too
start
Ignore this too

[user]$ display.sed test1.txt
This line should print

答案1

您可以使用一个范围(从第一次出现start到文件末尾)并d删除该范围内不匹配的所有行next。如果一行匹配,则读入next 行,p打印它然后quit:

sed -n '/start/,${
/next/!d;n;p;q
}' infile

我猜你真正想要的是一个display.sed包含以下内容的文件:

#!/bin/sed -nf

/start/,${
/next/!d;n;p;q
}

答案2

使用awk对于这种情况会更合适,因为它甚至可以在非 GNU 上工作awk实施:

awk '/^start/{ f=1 }f && /^next/ && getline nl>0{ print nl; exit }' test.txt
  • /^start/{ f=1 }f=1-在遇到的线上设置活动标志start

  • f && /^next/ && getline nl>0- 遇到next行时(与先前匹配的start行 - 由活动标志确保f) - 检查下一个需要的行是否存在getline nl>0

  • nl(“needed line”) - 包含该行之后的行next


输出(针对您当前的输入内容):

This line should print

答案3

关于什么grep?我将添加解释,如果这个命令确实是你想要的。

grep -Pzo '(?s)start.*?next\n\K.*?\n' input.txt

输入(您的两个示例合并)

start
next
This line should print
Ignore this
Ignore this
next
Ignore this
start
Ignore this
next
This line should print
Ignore this
next
Too late so ignore this too 
start
Ignore this too 

输出

This line should print
This line should print

相关内容