我用 grep 找到了所有需要的文件:grep --include=\*.{php,ini,conf,sh} -ril -P "'([\d\w\-\_\.]+)(@domain.com)'" '/var/www_data/somepath/'
现在我假设它是使用 sed 或 perl 来进行替换过程,可惜我无法弄清楚如何在其中任何一个中使用上面的正则表达式。我看见这边走和这边走但正如我所说,我无法让它与我的模式一起工作(我的意思是我在执行命令后在下一行中得到 > 。我认为与 sed 或 perl 一起使用时上面显示的正则表达式有问题),所以关于此事的任何建议都会很好。
另外,我不知道是否可能(这并不重要),但我想为发生替换的每个文件打印一些字符串,例如File fixed: /path/to/file/
(可能从 grep 列表中获取文件名?)
答案1
通常,当您点击后在下一行中看到 时>
,这意味着您的其中一个报价尚未关闭。我在你的正则表达式中找不到这个错误。但您不需要/var/www_data/somepath/
用单引号将路径引起来。我认为 中没有不寻常的字符somepath
?
不管怎样,我用 sed 测试了你的正则表达式。对我来说\d\w
看起来像vim
语法,这就是为什么我将它翻译为 ascii (它总是有效)。另外,[]
你的内心不需要逃避.
:
sed -r "s/'([A-Za-z0-9_-.]+)(@domain.com)'/'adsf'/g" test.dat
事实上,您可以使用sed
或perl
来完成您的任务。您不一定需要grep
生成文件列表,除非您有 GB 的数据。然后预分类可以带来速度优势。
测试你的正则表达式,您可以执行以下操作:
cd /var/www_data/somepath/
sed -r 's|pattern|replace-pattern|g' a_single_file.php
当您对结果感到满意时,只需添加-ibak
( --in-place=bak
) 参数并在所有文件上运行它
find . -type f -name '*.php' -o -name '*.ini' -o name '*.conf' -o -name '*.sh' \
-exec sed -r -ibak 's|pattern|replace-pattern|g' '{}' \;
原始文件正在放入<orignalname.php>.bak
.
回答你的最后一个问题。对于这项工作,grep
是您想要的工具,您可以在.bak
上面 sed 生成的文件上运行它:
grep --recursive --include='*.bak' -E --files-with-matches 'pattern' . > files_fixed.txt
或者,简单地说:
find . -type f -name '*.bak'
答案2
通过 GNU,sed
您可以使用sed -i
.
sed -i 'script' *.{php,ini,conf,sh}
答案3
大多数Linux:
sed -i 's#FIND#REPLACE#g' *.{php,ini,conf,sh}
在 MacOS 上:
sed -i '' 's#FIND#REPLACE#g' *.{php,ini,conf,sh}
MacOS 中的 sed 在 -i 之后需要一个备份参数,如果不需要备份文件,请使用空字符串。 “g”用于全局替换,否则它只是每行的第一个。