我可以用一个命令替换两个不同文件中的字符串吗?

我可以用一个命令替换两个不同文件中的字符串吗?

我有一个包含一些子目录的目录。我知道有两种类型的文件,例如*A*.txt*B*.txt,包含“旧字符串”在该目录下。我想将它们替换为“新字符串“。我可以在一个命令中执行此操作吗?也就是说,我可以"*B*.txt"在此命令中的某处添加以下内容:

find . -type f -name "*A*.txt" -exec sed -i 's/oldString/newString/g' {} \;

答案1

你可以试试:

find . -type f \( -name "*A*.txt" -o -name "*B*.txt" \) \
  -exec sed -i 's/oldString/newString/g' {} +

(这里还使用+代替来;避免sed每个文件运行一次调用;还有一个好处是,如果任何sed调用以非零退出状态返回)。

答案2

如果真的是的话只是, 你可以这样做:

find . -type f -name "*[AB]*.txt" -exec sed -i 's/oldString/newString/g' {} \;

需要明确的是,只有使用单个字母作为匹配项,这才有效。

答案3

如果你有 GNU find,你可以使用-regex而不是-name,并执行类似

find . -type -f -regextype egrep -regex "(.*A.*|.*B.*)\.txt" -exec sed -i 's/oldString/newString/g' {} \;

笔记如果该模式也可以出现在文件的目录路径中,则需要修改正则表达式(根据 @StéphaneChazelas 的评论)

-regex ".*(A|B)[^/]*\.txt"

排除/模式后面出现 a 的任何内容。

您可以使用以下命令检查正则表达式类型是否egrep可用

find -regextype help

相关内容