如何将包含斜线的variables传递给sed

实际上我知道这个问题的答案,但是我不止一次看到一些同事在这个问题上陷入困境,所以我认为这样做是值得的。 如果问题已经存在,我很乐意删除它。

所以在这里呢…

你如何将包含斜线的variables作为模式传递给sed

例如,如果我有以下variables:

 var="/Users/Documents/name/file" 

我想把它传递给sed如下所示:

 sed "s/$var/replace/g" $file 

但是我得到错误。 我怎样才能绕过这个问题呢?

使用备用正则expression式分隔符作为sed允许您使用任何分隔符( 包括控制字符 ):

 sed "s~$var~replace~g~" $file 

另一种做法,虽然比anubhava的答案丑,但是使用另一个sed命令来转义var所有反斜杠:

 var=$(echo "$var" | sed 's/\//\\\//g') 

那么,这将工作:

 sed "s/$var/replace/g" $file 

一个纯粹的bash答案:使用参数扩展来反斜杠转义variables中的任何斜杠:

 var="/Users/Documents/name/file" sed "s/${var//\//\\/}/replace/g" $file 

使用/ sed作为分隔符将与replace时的variables斜杠相冲突,因此会出现错误。 避免这种情况的一种方法是使用另一个分隔符,该分隔符是该variables中的任何字符都是唯一的。

 var="/Users/Documents/name/file" 

您可以使用适合场合的八angular形字符(或任何其他字符不是/易于使用)

 sed "s#$var#replace#g" 

要么

  sed 's#$'$var'#replace#g' 

当variables不包含空格时,这是合适的

要么

 sed 's#$"'$var'"#replace#g' 

使用上面的内容比较明智,因为我们有兴趣replace该variables中的任何内容,而不是使用双引号引起整个命令,这会导致您的shell将可能被认为是特殊shell字符的任何字符插入shell。

备用分隔符只在需要search和replace时才起作用。 在需要从文件中删除基于包含/(例如/dev/sda1 )的文字的情况下,它将不起作用。 例如:

 var1=/dev/sda1 sed -i ":$var1:d" $file 

我想用@Bolboa提出的解决scheme