bash - 替换找到的第一个文件中的字符串

标签 bash sed natural-sort

我有一堆这样命名的文件:

chapter1.tex
chapter2.tex
chapter3.tex
...
chapter 10.tex
chapter 11.tex
etc.

我正在尝试使用 sed 在所有文件中查找并用 ZZZZZZ 替换 AAAAAA 的第一个实例。

sed -i "0,/AAAAAA/s//ZZZZZZ/" chapter*.tex

我试过上面的命令,但是有两个问题:

  1. 它在每个文件中查找并替换 AAAAAA 的第一个实例。我只想要所有文件中的第一个实例。
  2. 我怀疑,与许多 Bash 工具一样,它不能正确地按顺序对我的文件进行排序。例如。如果我键入 ls,则 chapter10.tex 会列在 chapter1.tex 之前。按章节顺序搜索文件非常重要。

如何使用 Bash 工具从大量文件中查找和替换第一个实例,因此仅替换第一个找到的文件中的第一个实例,同时还尊重文件顺序 (chapter1.tex 是第一个,chapter10.tex 是第十个)?

最佳答案

有了完整的 GNU 工具箱,您就不需要循环了。

printf '%s\0' chapter*.tex    \
| sort -zV                    \
| xargs -0 grep -FlZ 'AAAAAA' \
| head -zn1                   \
| xargs -0r sed -i 's/AAAAAA/ZZZZZZ/'

关于bash - 替换找到的第一个文件中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68456788/

相关文章:

bash - nullglob 禁用路径名制表符完成

linux - 后台作业job id后面的后缀 "+"和 "-"是什么意思?

bash - 使用 PostgreSQL 和 bash 在单个事务中执行多个 .sql 文件

macos - 在 Mac OS shell 脚本中使用日期

bash - 特殊字符除以通配符的 SED 字符串

linux - 删除空字符(Shell 脚本)

algorithm - 如果字符串集中有多个可识别的数字序列,自然排序应该如何工作?

linux - 无法使用SED命令

sql - MySQL中的自然排序

sql - 以类似 Excel 的方式在 MySQL 中对 varchar 列进行排序