我有一个包含一些子目录的目录。我知道有两种类型的文件,例如*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