【问题标题】:How can i replace the all email address found in particular folder in linux如何替换在 linux 的特定文件夹中找到的所有电子邮件地址
【发布时间】:2012-11-30 17:23:05
【问题描述】:

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

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

我该怎么做。

我可以找到使用

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

但我不知道如何使用正则表达式和替换

【问题讨论】:

    标签: regex linux awk grep


    【解决方案1】:

    试试 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】:

    打开,然后

    如果你有

    oldmail="abc@gmail.com"
    newmail="myemail@provider.tld"
    shopt -s globstar
    sed -i "/$oldmail/s/$oldmail/$newmail/g" /var/www/sites/**/*
    

    如果不是:

    oldmail="abc@gmail.com"
    newmail="myemail@provider.tld"
    find /var/www/sites -type f -exec sed -i "/$oldmail/s/$oldmail/$newmail/g" {} +
    

    此解决方案的优点是修改文件中的时间戳,即使文件不包含搜索的字符串,这与没有先前 grepsed -iperl -i -pe 解决方案不同(我在这里用/pattern/ 做这个)

    【讨论】:

    • 真的吗?为每个文件启动一个带有 2 个子进程的 bash 进程?这太可怕了,如果你问我。 bash4 的解决方案很不错!
    • 将我的 find 解决方案更改为更轻的东西;)
    【解决方案3】:
    find /var/www/sites -type f | xargs sed --in-place 's/abc@gmail\.com/mynewemail@elsewhere.com/g'
    

    【讨论】:

    • 是的,在提交答案后,我立即发现自己怀疑 sed 上是否存在递归标志。对此感到抱歉。
    【解决方案4】:

    试试 sed。

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

    编辑:

    考虑了反馈。很抱歉之前的错误解决方案!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 2022-07-28
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2017-12-02
      相关资源
      最近更新 更多