如何编写一个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
。如果一行匹配,则读入n
ext 行,p
打印它然后q
uit:
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