问题描述
我想删除多个文本文件的第一行并将其替换为另一行。有没有办法使用终端来做到这一点?
我知道如何使用 vim,有没有办法用它实现自动化?我想避免手动操作(就像单独编辑每个文件一样)。
如果可能的话,我想避免安装新库(尤其是对于我认为非常简单的东西——但我可能是错的)。
提前致谢!
最佳回答
您可以使用 sed
:
sed -i.bak '1s/^.*$/new line/' *.txt
这将用文本 new line
替换当前目录中所有 .txt
文件的第一行,更改它以满足您的需要。
此外,原始文件将使用 .bak
扩展名进行备份,如果您不想这样做,请使用:
sed -i '1s/^.*$/new line/' *.txt
次佳回答
好吧,使用 vim
本身:
vim -Nesc 'bufdo call setline(1,"This is the replacement.") | wq' file1 file2 ...
这是做什么的:
-
setline (n, text)
是一个将n
行设置为text
的函数。 -
调用函数需要
call
。 -
bufdo
用于跨缓冲区重复命令(没有范围,它作用于所有缓冲区)。 -
wq
保存并退出缓冲区。我们需要在移动到下一个缓冲区之前执行此操作,因此该命令使用|
链接到call
命令。 -
-c cmd
运行cmd
是加载第一个缓冲区后的 command-mode 命令。 -
Nes
开启no-compatible,静默,ex-mode,更利于非交互处理。
好处:
-
setline
文本内容可以是任何内容 –sed
替换文本中的&
可能会产生意想不到的效果。
第三种回答
其他一些选择:
-
awk
(需要相对较新的 GNUawk
版本)\n
$ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt\n
-
Perl/shell
\n
$ for f in *txt; do\n perl -i -lne '$.==1 ? print "new line" : print' "$f"\n done\n
-
shell /核心工具
\n
$ for f in *txt; do \n ( echo "new line"; tail -n+2 "$f" ) > foo && mv foo "$f"; \n done\n