批量替换相同的直接和子文件夹中的字符串

时间:2014-09-09 09:10:59

标签: linux ssh sed grep

我正在尝试使用以下方法替换我的字符串

grep -rl matchstring . | xargs sed -i 's/string1/string2/g'

我想要实现的目前实际上我有一个像

这样的硬编码域名
http://account.mysmallwebsite.com
https://account.mysmallwebsite.com

因为这是非常不灵活的,我宁愿只是

<?php echo $domainName;?>

domainName的变量将在php文件中设置,并且所有文件都将包含此文件,因此将来如果我更改域,则更改1个地方而不是多个页面会更容易。

并替换所有出现的网站

http://account.mysmallwebsite.com
https://account.mysmallwebsite.com

使用echo字符串,但是如何通过putty shell ssh

中的命令行实现它

1 个答案:

答案 0 :(得分:3)

您可以使用以下内容:

find . -name "*.php" -exec sed -r -i.bak 's#http(s?)://account.mysmallwebsite.com#<?php echo $domainName;?>#g' {} \;

解释

  • find . -name "*.php" -exec ... {} \;这会查找名称以.php结尾的文件,并执行...中指示的命令。
  • sed -r -i.bak 's#http(s?)://account.mysmallwebsite.com#<?php echo $domainName;?>#g' file
    • 这会查找http(s?)://account.mysmallwebsite.com,即http +可能是s + ://account.mysmallwebsite.com,并将其替换为<?php echo $domainName;?>
    • 请注意使用#作为分隔符而不是典型的/,这样我们就不必转义网址中的斜杠。
    • -i.bak创建一个扩展名为.bak的备份文件,而原始版本则会就地编辑。
    • 你也可以&#34;玩&#34;使用-maxdepth值来定义要处理的子目录级别。例如,-maxdepth 1只会检查当前目录,而-maxdepth 2也会包含给定目录的子文件夹。

图形:

s#http(s?)://account.mysmallwebsite.com#<?php echo $domainName;?>#g
^      ^^^^                             ^^^^^^^^^^^^^^^^^^^^^^^^^
| ^^^^^^|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^       substitution        ^
|       |     look for this text                     replace all matches
|      may be an "s"
^  
search

请参阅运行中的sed命令:

$ cat a
hello
http://account.mysmallwebsite.com
https://account.mysmallwebsite.com
httpss://account.mysmallwebsite.com
bye

$ sed -r 's#http(s?)://account.mysmallwebsite.com#<?php echo $domainName;?>#g' a
hello
<?php echo $domainName;?>
<?php echo $domainName;?>
httpss://account.mysmallwebsite.com
bye