如何从具有特定字符串的行开头删除整个文本

如何从具有特定字符串的行开头删除整个文本

我用来sed -n '/string/,$p' file >> otherfile将文本从具有特定字符串的行复制到另一个文件。

现在我想删除原始文件中复制的文本。我用 sed 和 awk 尝试了不同的方法,但没有任何效果。

如何使用 sed 删除文件中包含特定字符串的起始行文本?

texta

texta1

textb    <- string, delete rest of the text from here

textb1

textc

textc1

或者用 sed 进行剪切而不是复制会更容易吗?命令是什么?

答案1

你可以w将指定范围的行写入一个新文件,然后d删除范围 - 棘手的部分是防止d命令被视为输出文件名的一部分。在 GNU sed 中,您可以通过使用以下命令将写入和删除分成单独的表达式来做到这一点-e

重要提示:这将截断otherfile而不是附加到它

sed -i.bak -e '/string/,${w otherfile' -e 'd;}' file

答案2

或者使用ed!

ed -s file <<< $'/textb/,$w otherfile\n/textb/,$d\nw\nq'

鉴于您的意见文件的:

texta

texta1

textb    <- string, delete rest of the text from here

textb1

textc

textc1

执行ed命令后,文件变成:

texta

texta1

(末尾有一个空行,在此处的格式中消失);和其他文件包含:

textb    <- string, delete rest of the text from here

textb1

textc

textc1

命令ed是:

  • /textb/,$w otherfile-- 将行范围写入其他文件
  • /textb/,$d-- 删除该范围的行
  • w-- 将更改的文件写入磁盘
  • q——退出编辑

答案3

如果您使用此命令sed -n '/string/,$p' file >> otherfile从一个命令中提取所有行含有 string到文件末尾 ( $) 到 otherfile 文件。

提取其补码的最简单方法是对匹配项进行补码:

sed '/string/,$d' file >> someOtherDifferentFile

如果您想要/需要更新原始文件,只需将结果复制回来即可。

这就是-ised 选项的作用,因此,这将更新原始文件:

sed -i.bak '/string/,$d' file

相关内容