sed搜索并替换包含/的字符串

时间:2012-04-25 05:45:26

标签: bash sed

我无法弄清楚如何使用sed来搜索和替换文本文件/中包含/etc/myconfig字符的字符串。

例如,在我现有的文本文件中,我有:

myparam /path/to/a argB=/path/to/B xo

我希望将其替换为:

myparam /path/to/c argB=/path/to/D xo

我试图在bash中这样做:

line='myparam /path/to/a argB=/path/to/B xo'
line_new='myparam /path/to/c argB=/path/to/D xo'
sed -i 's/$line/$line_new/g' /etc/myconfig

但没有任何反应。

尝试

grep -rn "$line" /etc/myconfig

确实会给我'myparam /path/to/a argB=/path/to/B xo'返回。

表达sed命令以执行此搜索并替换并正确处理/命令的正确方法是什么? (我认为我的字符串中的/字符是给我问题的字符,因为我使用类似的sed命令来搜索和替换文本文件中的另一行没有问题,并且该行没有有一个/字符。

2 个答案:

答案 0 :(得分:34)

不要逃避反斜杠;你会迷惑自己。在文本中未显示的s命令后使用不同的符号(我在下面的示例中使用%):

line_old='myparam /path/to/a argB=/path/to/B xo'
line_new='myparam /path/to/c argB=/path/to/D xo'
sed -i "s%$line_old%$line_new%g" /etc/myconfig

另外,用双引号括起整个字符串;使用单引号表示sed看到$line(原始版本)而不是扩展值。在单引号内,没有扩展,也没有元字符。如果您的文本几乎可以包含任何纯文本字符,请使用控制字符(例如control-A或control-G)作为分隔符。

请注意,此处-i的使用反映了问题中的内容,但假设使用了GNU sed。 BSD sed(在Mac OS X上也可以找到)需要后缀。您可以使用sed -i '' …替换原位;这与GNU sed无效。要在两者之间移动,请使用-i.bak;这将适用于两者 - 但为您提供了一个您可能想要删除的备份文件。其他Unix平台(例如AIX,HP-UX,Solaris)可能具有sed的变体,根本不支持-i。 POSIX规范不要求sed

答案 1 :(得分:13)

这可能对您有用:

sed -i "s|$line|$line_new|g" /etc/myconfig

您必须使用",以便插入$line$new_line。还可以使用|或匹配或替换字符串中未找到的任何字符作为分隔符。