我想删除多个文本文件的第一行并将其替换为另一行。有没有办法使用终端来做到这一点?
我知道如何使用 vim,有没有办法让它自动化?我想避免手动操作(比如单独编辑每个文件)。
如果可能的话,我想避免安装新的库(特别是对于我认为非常简单的东西 - 但我可能是错的)。
提前致谢!
答案1
您可以使用sed
:
sed -i.bak '1s/^.*$/new line/' *.txt
.txt
这将用文本替换当前目录中所有文件的第一行new line
,请根据需要进行更改。
另外,原始文件将带有.bak
扩展名进行备份,如果您不想要,只需使用:
sed -i '1s/^.*$/new line/' *.txt
答案2
好吧,利用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
是一个命令模式命令。Nes
打开不兼容、静默、ex 模式,这更适合非交互式处理。
好处:
- 文本
setline
内容可以是任何内容——&
替换sed
文本可能会产生意想不到的效果。
答案3
其他一些选择:
awk
(需要相对较新版本的 GNUawk
)$ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
Perl/shell
$ for f in *txt; do perl -i -lne '$.==1 ? print "new line" : print' "$f" done
Shell/coreutils
$ for f in *txt; do ( echo "new line"; tail -n+2 "$f" ) > foo && mv foo "$f"; done
答案4
使用gawk
gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt
例子
% cat foo.txt
1
2
3
4
% cat bar.txt
1
2
3
4
% gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt
% cat foo.txt
your_replacement
2
3
4
% cat bar.txt
your_replacement
2
3
4