Unix环境下含斜杠的字符串替换:grep+sed命令修改方案
解决包含斜杠的字符串替换问题
当你要替换的字符串里包含斜杠(/)时,直接用默认的斜杠作为sed替换命令的分隔符会导致语法错误——因为sed会把字符串里的斜杠当成命令的分隔符,从而无法正确识别你要替换的内容。这里有两种简单的解决办法:
方法一:更换sed的分隔符(推荐)
sed的s命令允许你使用任意非空白、非反斜杠的字符作为分隔符,只要这个字符不在你要替换的字符串里出现就行。比如我们可以用#、@或者|来替代默认的/。
针对你的例子,修改后的命令如下:
grep -rl matchstring somedir/ | xargs sed -i 's#/home/folder1#/home/folder1/folder2#g'
这里把原来的/换成了#作为分隔符,字符串里的斜杠就不会干扰命令语法了。你可以根据自己的字符串内容选择合适的分隔符,比如如果路径里有#,那就换成@,只要保证不冲突即可。
方法二:转义字符串中的斜杠
如果你不想换分隔符,也可以把每个斜杠用\/转义,告诉sed这是一个普通字符而不是命令分隔符。修改后的命令是:
grep -rl matchstring somedir/ | xargs sed -i 's/\/home\/folder1/\/home\/folder1\/folder2/g'
不过这种方法在字符串较长、斜杠较多时容易出错,写起来也麻烦,所以更推荐第一种方法。
内容的提问来源于stack exchange,提问作者Shannon
相关产品推荐
相关产品推荐

