使用grep获取结果后如何替换文本字符串(批量)

时间:2019-01-30 08:31:25

标签: search replace grep

我的一台Linux MySQL服务器崩溃了。所以我放了一个备份,但是这次MySQL运行的是本地(localhost)而不是远程(IP地址)。

感谢Stack Overflow用户,我找到了一个很好的命令,可以在给定目录中的所有.php文件中找到IP地址!我为此使用的命令是:

 grep -r -l --include="*.php" "100.110.120.130" .

这将输出必要的文件及其课程位置。如果结果少于10个,我显然会手动更改它们。但是,我收到了200多个点击/结果。

所以现在我想知道是否存在一个安全命令,该命令以文本“ localhost”代替IP地址(例如:100.110.120.130),而不是给定目录(/ var / www / vhosts /)递归。

也许,如果只有可能并且工作量不大,还会将更改的行输出到文件中吗?我不知道那是否有可能。

也许有人可以为我提供可行的解决方案?老实说,我不敢为此无所事事。这就是为什么我创建了一个新线程。

1 个答案:

答案 0 :(得分:2)

在多个文件中替换字符串的最标准方法是使用诸如sed之类的工具。通过grepwhile loop结合使用,可以逐行读取(当输出到文件时)通过sed获取的文件列表。

$ grep -r -l --include="*.php" "100.110.120.130" . > list.txt
# this will output all matching files to list.txt

在匹配文件中替换IP

while read -r line ; do echo "$line" >> updated.txt ; sed -i 's/100.110.120.130/localhost/g' "${line}" ; done<list.txt

这将使用list.txt并将其逐行读取到sed命令,该命令应将所有出现的IP替换为“ localhost”。 echo之前的sed命令输出所有将被修改为文件updated.txt的文件名(尽管list.txt包含相同的文件名,但这不是必需的,尽管也许可以用作验证手段。)

  

要在修改所有匹配文件之前进行试运行,请删除   -i命令中的sed,它将把输出打印到stdout   而不是就地修改文件。