获取行直到第一个匹配的模式范围

获取行直到第一个匹配的模式范围

我有一个如下所示的文件:

line1
line2
line3
line4
line5
line6
line7
line5
line2

我想获取line1和之间的数据line5。我用了awk '/line1/,/line5/' myfile。预计输出将是:

line1
line2
line3
line4
line5

但 awk 会读取直到最后一个匹配line5。我希望 awk 在第一场比赛中停止,而不是在最后一场比赛中停止。

答案1

我无法重现你的问题。 awk *做了我期望的事情:打印第一次出现 之间的每一行,line1直到第一次出现line5:

$ awk '/line1/,/line5/' file
line1
line2
line3
line4
line5

line5文件第五行的字符串中是否有隐藏的非打印字符?这可以解释为什么awk不匹配它。


您可以通过运行等效命令来仔细检查sed

$ sed -n '/line1/,/line5/p' file
line1
line2
line3
line4
line5

指示不打印每一行(其默认行为),同时指示打印从 的第一个匹配项到 的第一个匹配项之间-n的每一行。sed/line1/,/line5/pline1line5


如果您只想打印第一的以匹配模式的行开头line1并以匹配 的行结尾的一组行line5,您可以使用:

sed -n '/line1/,$p;/line5/q' file

*我使用 进行了检查gawk,GNU 实现awk(Kusalananda 已确认在 OpenBSD 上awkmawk做了正确的事情)。

答案2

您可以使用以下awk

awk '/line1/{prnt=1} prnt{print} /line5/{exit}' infile

这将打印与 匹配的行,line1直到下一个第一行与 匹配,line5然后立即退出。

答案3

awk '/foo/,/bar/'

印刷全部文件中以匹配的行开头foo并以匹配的下一行(甚至是与等效行相反的同一行sed)结束的部分bar(请注意,正则表达式也匹配包含includeline1的行)。line1anythingline10

如果你想匹配第一的以匹配的行开始line1并以匹配的下一行(或同一行)结束的部分line5,您可以执行以下操作:

sed '/line1/,$!d;/line5/q' < file

line5(请注意,如果在第一个匹配的行之后没有匹配的行line1,它将从该line1行打印到文件末尾。另请注意,sed模式是基本的正则表达式,而awk那些是扩展表达式)。

相关内容