我该如何解决这个问题:
abc="a/b/c"; echo porc | sed -r "s/^/$abc/"
sed: -e expression #1, char 7: unknown option to `s'
变量$abc
的替换正确完成,但问题是$abc
包含斜杠,这会混淆sed
。我可以以某种方式逃避这些斜线吗?
答案 0 :(得分:7)
请注意,sed(1)
允许您为s///
分隔符使用不同的字符:
$ abc="a/b/c"
$ echo porc | sed -r "s|^|$abc|"
a/b/cporc
$
当然,如果你走这条路,你需要确保你选择的分隔符不会在输入的其他地方使用。
答案 1 :(得分:6)
GNU manual for sed
表示“/字符可以被任何给定s命令中的任何其他单个字符统一替换。”
因此,只需使用其他字符代替/
,例如:
:
abc="a/b/c"; echo porc | sed -r "s:^:$abc:"
请勿使用可在输入中找到的字符。我们可以使用上面的:
,因为我们知道输入(a/b/c/
)没有不包含:
。
小心角色转义。
如果使用""
,Bash会特别解释某些字符,例如`
(用于内联执行),!
(用于accessing Bash history),$
(用于访问变量)。
如果使用''
,Bash将按字面意思收集所有字符,甚至是$
。
这两种方法可以结合使用,具体取决于您是否需要转义,例如:
abc="a/b/c"; echo porc | sed 's!^!'"$abc"'!'
答案 2 :(得分:3)
您不必使用/
作为模式并替换分隔符,正如其他人已经告诉过您的那样。我会选择:
,因为它很少用在路径中(它是PATH环境变量中的分隔符)。坚持一个并使用shell内置的字符串替换功能使其防弹,例如${abc//:/\\:}
(这意味着,如果:
是分隔符,则\:
中的${abc}
替换所有:
次出现。
$ abc="a/b/c"; echo porc | sed -r "s:^:${abc//:/\\:}:"
a/b/cporc
答案 3 :(得分:1)
反斜杠:
abc='a\/b\/c'
空间填充......
答案 4 :(得分:0)
至于问题的逃避部分,我遇到了同样的问题,并通过可以优化的双重解决方案解决。
escaped_abc=$(echo $abc | sed "s/\//\\\AAA\//g" | sed "s/AAA//g")
使用三A,因为否则在其输出前面的反斜杠后面的正斜杠永远不会放在输出中,无论你放在前面有多少反斜杠。