如何删除 sed 上字符串出现之前和出现时的所有文本

如何删除 sed 上字符串出现之前和出现时的所有文本

我记得如何做到这一点,甚至从 Stack Exchange 学到了它,但忘记了我如何用谷歌搜索它,所以现在我找不到它。我现在找到的答案并不是我想要的。这是一个示例文本:

The quick
brown fox
jumps over
the lazy
dog

我希望 sed 在它说“jum”之前和当它说“jum”时删除所有内容,所以输出将是这样的:

ps over
the lazy
dog

我该怎么做呢?

答案1

sed -ne '1,/^jum/{s/^jum//p;d;}' -e p

正如 @Sundeep 在评论中指出的那样,如果您有 GNU sed,最好使用 sed -ne '0,/^jum/{s/^jum//p;d;}' -e p.即使jum在第一行,这也会起作用。情况并非如此1,/^jum/

它的作用如下:

  • sed -n:除非被告知,否则不要打印任何内容
  • 1,/^jum/:对于第一行和以包含开头的行之间的行jum
    • s/^jum//p:如果可以删除行首的“jum”,则打印结果
    • d: 并继续下一行
  • -e p:所有其他行,只需打印它们即可。

答案2

使用 GNU sed,并假设您的文件足够小以适合内存,您可以执行以下操作:

$ sed -z 's/.*jum//' file 
ps over
the lazy
dog

告诉-zsed其输入视为 NUL 分隔,这意味着它期望 NUL ( \0) 来表示每行的结尾。由于您的文件将没有 NUL 字符,因此 sed 将整个文件视为一行,因此我们可以在单个s///操作中完成整个操作。

请注意,这将找到最后的 jum并删除之前的所有内容。如果之前还出现过其他情况jum,这些内容将被删除。

答案3

awk

$ awk 'sub(/^jum/, ""){f=1} f' ip.txt
ps over
the lazy
dog

如果替换成功,设置一个标志来打印这些行。

相关内容