当前位置: 首页>>技术教程>>正文


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

,

问题描述

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

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

    \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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13361.html,未经允许,请勿转载。