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