如何在第一次匹配后退出“sed”?

如何在第一次匹配后退出“sed”?

我需要I/f在文件中的某段行数范围内搜索模式,并在第一次匹配时退出。为此,我使用如下 sed 命令

sed -n '14922,28875{\|I/f|=}' file.txt

它实际上打印了第 14922 行到第 28875 行之间的所有出现情况,但我只想要第一次出现的情况。

我对此有一个替代解决方案,即通过管道传输输出并使用 head 命令。类似这样的操作

sed -n '14922,28875{\|I/f|=}' file.txt | head -n 1

它有效,但我想知道是否可以不使用 head 命令。我在互联网上搜索,发现我们使用q字符,但不知何故我没有找到在命令中插入它的正确位置。有人能帮我吗

答案1

使用{=;q}而不是=

sed -n '14922,28875{\|I/f|{=;q}}' file.txt

如果没有匹配,sed将继续读取文件而没有机会产生任何输出。这不是最优的。处理完第 28875 行后退出:

sed -n '14922,28875{\|I/f|{=;q}};28875q' file.txt

请注意,在您的示例中head -n 1,如果head完成其工作并退出,则sed只有当它尝试将第二行写入其标准输出时才会注意到这一点(比较)。这意味着sed将继续处理文件,直到找到第二个匹配项或直到最后。在这方面,它甚至比我的次优解决方案更糟糕q

相关内容