搜索并替换特定文件扩展名的字符串

搜索并替换特定文件扩展名的字符串

我有这个狂欢:

  replace="s/AAAA/BBBB/g";
  find myDirectory/. -type f -print0 | xargs -0 sed -i $replace;

这将递归扫描树并替换其中文件中所有myDirectory出现的。AAAABBBB

但我想限制这种情况发生在特定扩展名的文件上,例如.txt,,,.read.po

我如何施加这个限制?

答案1

您可以使用-namefind 选项来根据文件名限制匹配。

find myDirectory/. -type f -name '*.txt' -print0 | xargs -0 sed -i "$replace"

对于多个扩展,您可以使用-o(或) 并将它们分组()

find myDirectory/. -type f \( -name '*.txt' -o -name '*.read' \) -print0 | xargs -0 sed -i "$replace"

另一个可以进行的改进是使用-exec代替xargs.这更加便携并且消除了子外壳。

find myDirectory/. -type f -name '*.txt' -exec sed -i "$replace" {} +

答案2

将这些设置添加到您的.bashrc

shopt -s extglob globstar

extglob打开一些额外的图案,包括@(…)析取的构造。globstar打开**/递归遍历目录。

那么你不需要使用find

sed -i "$replace" mydirectory/**/*.@(txt|read|po)

在 zsh 中,你不需要任何特殊选项,只需运行

sed -i $replace mydirectory/**/*.(txt|read|po)

如果您有很多文件,您可能会看到类似“超出命令行长度限制”的消息。但现代 Linux 系统上的限制非常高,您不太可能遇到它。

答案3

我成功地尝试了这一点——用 AOS 替换 DBA 的出现

sed -i -E "s/DBA/AOS/g" *.sh

相关内容