跳到内容

sed - 搜索和替换

sed 是一个命令,代表“流编辑器”。

约定

  • path: 实际路径。例如:/var/www/html/
  • filename: 实际文件名。例如:index.php

使用 sed

使用 sed 进行搜索和替换是我的个人偏好,因为你可以使用你选择的定界符,这使得用“/”替换诸如 Web 链接之类的东西非常方便。sed 用于就地编辑的默认示例显示了如下示例

sed -i 's/search_for/replace_with/g' /path/filename

但是,如果你要搜索包含“/”的字符串怎么办?如果正斜杠是唯一可用的定界符?您将不得不转义每个正斜杠才能在搜索中使用它。这就是 sed 胜过其他工具的地方,因为定界符可以在运行时更改(无需在任何地方指定您正在更改它)。如上所述,如果你要查找包含“/”的内容,你可以通过将定界符更改为“|”来做到这一点。以下是如何使用此方法查找链接的示例

sed -i 's|search_for/with_slash|replace_string|g' /path/filename

您可以使用任何单字节字符作为定界符,但反斜杠、换行符和“s”除外。例如,这也行得通

sed -i 'sasearch_forawith_slashareplace_stringag' /path/filename,其中“a”是定界符,搜索和替换仍然有效。为了安全起见,您可以在搜索和替换时指定备份,这对于确保您使用 sed 进行的更改是您真正想要的非常有用。这为您提供了一个从备份文件进行恢复的选项

sed -i.bak s|search_for|replacea_with|g /path/filename

这将创建一个名为 filename.bak 的未编辑版本的 filename

您也可以使用完整的引号而不是单引号

sed -i "s|search_for/with_slash|replace_string|g" /path/filename

选项说明

选项说明
i就地编辑文件
i.ext使用任何扩展名 (ext 在此处) 创建备份
s指定搜索
g指定全局替换,或所有出现

多个文件

不幸的是,sed 没有像 perl 那样提供内联循环选项。要循环遍历多个文件,您需要将您的 sed 命令组合到一个脚本中。以下是执行此操作的示例。

首先,生成您的脚本将使用的文件列表。在命令行使用以下命令

find /var/www/html -name "*.php" > phpfiles.txt

接下来,创建一个脚本使用此 phpfiles.txt

#!/bin/bash

for file in `cat phpfiles.txt`
do
        sed -i.bak 's|search_for/with_slash|replace_string|g' $file
done

该脚本循环遍历 phpfiles.txt 中创建的所有文件,为每个文件创建备份,并全局执行搜索和替换字符串。当您验证更改是您想要的更改时,您可以删除所有备份文件。

其他阅读和示例

结论

sed 是一个强大的工具,非常适合搜索和替换功能,尤其是在需要灵活的定界符时。

作者: Steven Spencer