如何通过单个命令将文件中删除的行打印到新文件中?

如何通过单个命令将文件中删除的行打印到新文件中?

例如:
文件 A 包含 20 行,我删除了前 10 行sed -i 1,10d A.txt

我应该写什么命令来将这 10 行删除的行打印到文件 B 中?

我尝试过sed -i 1,10d A.txt >> B.txt哪个不起作用。

答案1

使用sedsed脚本

1,10{
    w otherfile
    d
}

这会将第 1 行到第 10 行写入文件,otherfile同时从输入中删除它们。

对原始文件进行就地编辑(sed此处使用 GNU):

sed -i '1,10{w B.txt
        d}' A.txt

需要换行符来分隔文件名。或者,

sed -i -e '1,10{w B.txt' -e 'd}' A.txt

答案2

ksh93

{ head >> B.txt; cat 1<>; A.txt; } < A.txt

如果您cat是 GNU cat,它会抱怨它的 stdout 引用与其 stdin 相同的文件。您可以通过使用cat|catother ofcat或 useksh93的内置函数来解决这个问题,cat例如通过 using command /opt/ast/bin/catnot ofcat或 put /opt/ast/binbefore $PATH

重定向1<>;运算符的行为类似于标准1<>运算符(以读+写模式打开没有截断)除了它还会截断文件到底如果重定向命令成功。

答案3

假设您的要求是:

  • 将文件A的前10行写入文件B
  • 删除文件 A 的前 10 行sed -i 1,10d A.txt

您可以通过以下方式进行操作:

head -10 A.txt > B.txt
sed -i 1,10d A.txt

第一个命令会将文件 A.txt 的前 10 行写入 B.txt
第二个命令(按照您的建议)将从文件 A.txt 中删除前 10 行

请注意,为了获得前 10 行,您应该这样做在删除这些行之前

答案4

您可以使用 sed 和管道来实现这一点

sed -n '1,10p' a.txt > b.txt | sed -i '1,10d' a.txt

前 10 行将a.txt被复制到,b.txt然后前 10a.txt行将被删除。

相关内容