如何将包含斜线的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