【问题标题】:How to replace text strings (by bulk) after getting the results by using grep使用 grep 获取结果后如何替换文本字符串(批量)
【发布时间】:2019-01-30 08:31:24
【问题描述】:

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

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

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

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

所以现在我想知道是否有一个安全的命令将 IP 地址(例如:100.110.120.130)替换为文本“localhost”而不是给定目录中的所有 .php 文件(/var/www/ vhosts/) 递归。

也许,如果可能而且工作量不大,也可以将更改的行输出到文件中?我不知道这是否可能。

也许有人可以为我提供一个可行的解决方案?说实话,我也不敢这么忽悠。这就是我创建一个新线程的原因。

【问题讨论】:

  • 无论您采用何种解决方案,请事先备份文件。
  • 当然。代表自己。但与其一遍又一遍地恢复,我宁愿马上正确地做。

标签: search replace grep


【解决方案1】:

在多个文件中替换字符串的最标准方法是使用诸如sed 之类的工具。通过grep 获得的文件列表可以使用while 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”。直接在sed 之前的echo 命令输出所有将被修改到文件updated.txt 中的文件名(尽管list.txt 包含相同的文件名,但它可以用作也许是验证)。

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

【讨论】:

  • 哇!感谢您的帮助和详细信息。我测试了几次,它的工作原理。虽然我有一个问题,它没有取代 IP,但也许那是因为这条线是如何制定的?就像这样: $link = mysql_connect("100.110.120.130:3306", $username, $password);诡异的。但这没关系,因为大多数结果都被正确替换了。我将手工完成最后几个。再次感谢 I'L'I!
  • 哦,还有更多;它只在“updated.txt”中显示一个更改的行,这是正确的行为吗?
  • 不客气!嗯,奇怪的是你提到的一个事件不匹配,因为它应该像所有其他事件一样工作。您正在运行Linux 的哪个发行版/版本?至于“updated.txt”问题,使用两个&gt;&gt; 而不是一个&gt;,使用一个覆盖文件而两个附加它 - 错字:/
  • 你可以试试这个作为测试echo '$link = mysql_connect("100.110.120.130:3306", $username, $password);' | sed 's/100.110.120.130/localhost/g'。您得到相同的结果,还是将 IP 替换为 localhost
  • 顺便运行 CentOS 6。我明天再试一次。目前刚离开牙医(而且很痛苦)。 :S
猜你喜欢
  • 2017-03-20
  • 2011-04-08
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 2018-02-24
  • 1970-01-01
相关资源
最近更新 更多