Bash 使用grep中的行号打印带有sed的行

Bash 使用grep中的行号打印带有sed的行,bash,sed,grep,pipe,Bash,Sed,Grep,Pipe,我正在尝试从grep到sed的管道编号 首先,我提取了要使用sed打印的内容的开始行和结束行: grep -n "Start" file1 | cut -d: -f 1 | head -n 1 grep -n "End" file1 | cut -d: -f 1 | head -n 1 现在,我需要用这些数字来打印从开始到结束的所有内容。例如 sed -ne '1,30w output1' file1 我不知道如何才能做到这一点,因为将管线编号输送到sed将被视为输入,对吗 例如: Star

我正在尝试从grep到sed的管道编号

首先,我提取了要使用sed打印的内容的开始行和结束行:

grep -n "Start" file1 | cut -d: -f 1 | head -n 1
grep -n "End" file1 | cut -d: -f 1 | head -n 1
现在,我需要用这些数字来打印从开始到结束的所有内容。例如

sed -ne '1,30w output1' file1
我不知道如何才能做到这一点,因为将管线编号输送到sed将被视为输入,对吗

例如:

Start
some text
some more text
End
Start
some text
some more text
End
因为有不止一个开始和结束,我从grep中删除了其余的行号。我应该把grep和sed结合起来,或者这不可能吗?

你可以不用grep来做


应该可以工作。

看起来您希望从第一次出现的开始打印到随后的第一次出现的结束(包括结束)。那就是:

awk '/Start/{found=1} found{print; if (/End/) exit}' file

这可能适用于GNU sed:

sed -ne '/Start/,/End/w outputfile' -e '/End/q' file
这会将第一个开始和结束之间的行写入outputfile,然后退出并避免使用grep

如果您必须使用grep,那么可能:

sed -n "$(grep -n "Start" file | cut -d: -f 1 | head -n 1),$(grep -n "End" file | cut -d: -f 1 | head -n 1)"'p' file

为什么你想要grep,为什么你不能用sed自己呢?sed-n'/Start/,/End/w output1'文件1如果您添加一个示例,以及您希望输出的方式,这将很有帮助。@clement您可以将其添加为答案吗?您首先要对开始和结束的行引用进行编号,然后用“剪切”去掉编号。你为什么要对行进行偶数编码?我不知道实际的问题是什么。我更喜欢这个解决方案,而不是使用range/Start/,/End/,因为如果你需要其他调整,它更灵活。这完全是错误的方法,所以我不打算这样做,但也许其他人会帮你解决这个问题。祝你好运,就是这样。我在sed中使用了错误的grep语法。非常感谢。
sed -n "$(grep -n "Start" file | cut -d: -f 1 | head -n 1),$(grep -n "End" file | cut -d: -f 1 | head -n 1)"'p' file