2012-04-25 85 views
21

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

举例来说,在我现有的文本文件,我有:

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命令搜索并替换没有问题的文本文件,另一行和该行没有/字符。

+1

替换和引用规则实际上是关于bash而不是sed的。你可能想添加bash作为标签。 – KarlM 2012-04-25 05:56:43

+0

好的。将添加'bash'作为标签。 – 2012-04-25 05:59:37

回答

32

不要逃避反斜杠,你会混淆自己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

+0

谢谢!双引号'''和'%'完成了诀窍,我最初试着通过'\ /'试图转义'/'字符,并且这根本不起作用 – 2012-04-25 05:57:16

+0

请注意,如果您需要指定一系列行通过正则表达式和正则表达式包含斜线,你可以使用'sed -n'\ @ dir/file @,\ @ dir2/file2 @ p',其中'@'前面的反斜线表示'@'是搜索分隔符这个表达式 – 2014-12-14 16:02:13

+0

请注意,可能需要'sed -i -e' – PhysicalChemist 2016-08-16 20:04:36

12

这可能会为你工作:

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

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

+1

好的。我不知道这个'诀窍'。所以你的意思是说任何分隔符都可以工作,只要它不是在搜索中找到的字符或替换字符串? – 2012-04-25 05:58:17

+0

是的; 's'之后的第一个字符用于将命令分成两部分;要匹配的模式和替换模式。 's/search/replace /'使用'/'三次;但是'|搜索|替换|'或'%search%替换%'也可以。 Perl允许匹配的括号('{{} {替换}'),但是'sed'不会(除非,如果你有GNU'sed',你可能已经激活了Perl模式选项)。 – 2012-04-25 06:06:14

+1

是的,在合理范围内。由于'''不太可能出现在文件中,所以''是一个方便的用法。然而,它是一个元字符(用于交替),所以如果你想说's/this \ | that/those /',那么使用另一个分隔符,比如'@'或'#'或'','''''或' %'等。另外请注意,这是为了使用搜索命令'/.../'的替换命令来使用另一个分隔符,前面带有反斜杠,例如'\ | foo |' – potong 2012-04-25 06:10:16