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
手册页sed
其他示例sed
&awk
O'Reilly 书籍
结论¶
sed
是一个强大的工具,在搜索和替换功能方面非常有效,尤其是在需要灵活定界符的情况下。
作者:Steven Spencer