Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何替换linux中特定文件夹中的所有电子邮件地址_Regex_Linux_Awk_Grep_Shell_Bash4 - Fatal编程技术网

Regex 如何替换linux中特定文件夹中的所有电子邮件地址

Regex 如何替换linux中特定文件夹中的所有电子邮件地址,regex,linux,awk,grep,shell,bash4,Regex,Linux,Awk,Grep,Shell,Bash4,我在某个文件夹中有一些脚本。比如/var/www/sites 现在我想替换所有文件夹和子文件夹中脚本中硬编码的所有电子邮件地址,并替换为我的电子邮件地址 我该怎么做呢 我能找到你 grep-rn”abc@gmail.com“/var/www/sites/ 但是我不知道如何使用regex和替换sed grep -rl "abc@gmail.com" /var/www/sites/ | xargs sed -i 's/oldemail/newemail/g' 编辑: 考虑到反馈。很抱歉,以前的解决

我在某个文件夹中有一些脚本。比如
/var/www/sites

现在我想替换所有文件夹和子文件夹中脚本中硬编码的所有电子邮件地址,并替换为我的电子邮件地址

我该怎么做呢

我能找到你

grep-rn”abc@gmail.com“/var/www/sites/

但是我不知道如何使用regex和替换sed

grep -rl "abc@gmail.com" /var/www/sites/ | xargs sed -i 's/oldemail/newemail/g'
编辑:

考虑到反馈。很抱歉,以前的解决方案错误

打开a,然后

如果您有:

如果没有:

oldmail="abc@gmail.com"
newmail="myemail@provider.tld"
find /var/www/sites -type f -exec sed -i "/$oldmail/s/$oldmail/$newmail/g" {} +
这种解决方案的优点是,即使文件不包含搜索的字符串,也不会修改文件中的时间戳,这与以前没有grep的
sed-i
&
perl-i-pe
解决方案不同(我在这里使用
/pattern/
)试试perl:

perl -p -i -e 's/abc@gmail.com/new@gmail.com/g' /var/www/sites/*
或者使用perl/find:

find /var/www/sites/ -exec perl -p -i -e 's/abc@gmail.com/new@gmail.com/g' {} \;

这样做的缺点是,即使文件不包含搜索到的字符串,也会修改文件。请参见“我的编辑”…它不会编辑,只会搜索,而且只有在数千个文件上执行此操作时才有意义,但基本上你是对的。;-)否则,您的解决方案需要为每个文件执行3个进程,这可能比搜索许多文件更“不需要”。如果您担心修改不包含字符串的文件,请使用grep而不是find…。或者以正确的方式使用perl或sed,请参阅我的帖子。真的吗?为每个文件启动包含2个子进程的bash进程?如果你问我的话,那太可怕了。尽管如此,
bash4
解决方案还是不错的!将我的“查找解决方案”更改为更轻的;)是的,在提交答案后,我立即发现自己怀疑sed上是否存在递归标志。很抱歉。
find /var/www/sites/ -exec perl -p -i -e 's/abc@gmail.com/new@gmail.com/g' {} \;
find /var/www/sites -type f | xargs sed --in-place 's/abc@gmail\.com/mynewemail@elsewhere.com/g'