例如:
文件 A 包含 20 行,我删除了前 10 行sed -i 1,10d A.txt
我应该写什么命令来将这 10 行删除的行打印到文件 B 中?
我尝试过sed -i 1,10d A.txt >> B.txt
哪个不起作用。
答案1
使用sed
和sed
脚本
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|cat
other ofcat
或 useksh93
的内置函数来解决这个问题,cat
例如通过 using command /opt/ast/bin/cat
not ofcat
或 put /opt/ast/bin
before $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
行将被删除。