我有一堆这样命名的文件:
chapter1.tex
chapter2.tex
chapter3.tex
...
chapter 10.tex
chapter 11.tex
etc.
我正在尝试使用 sed
在所有文件中查找并用 ZZZZZZ
替换 AAAAAA
的第一个实例。
sed -i "0,/AAAAAA/s//ZZZZZZ/" chapter*.tex
我试过上面的命令,但是有两个问题:
- 它在每个文件中查找并替换
AAAAAA
的第一个实例。我只想要所有文件中的第一个实例。 - 我怀疑,与许多 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/