如何使用单个命令编辑多个文本文件?

如何使用单个命令编辑多个文本文件?

我想删除多个文本文件的第一行并将其替换为另一行。有没有办法使用终端来做到这一点?

我知道如何使用 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(需要相对较新版本的 GNU awk

    $ 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

相关内容