我用来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
如果您想要/需要更新原始文件,只需将结果复制回来即可。
这就是-i
sed 选项的作用,因此,这将更新原始文件:
sed -i.bak '/string/,$d' file