跳至内容

sed - 搜索和替换

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

约定

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

使用 sed

我个人偏爱使用 sed 进行搜索和替换,因为你可以使用自己选择的定界符,这使得替换包含“/”之类的网络链接非常方便。用于就地编辑的默认 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