在 bash 中将带有分号 (';') 的值赋给变量

Kes*_*hav 2 unix shell escaping sed

我试图用 sed 在 unix shell (bash) 上的字符串中转义 ('\') 分号 (';')。当我直接执行而不将值分配给变量时它会起作用。那是,

$ echo "hello;" | sed 's/\([^\\]\);/\1\\;/g'
hello\;
$
Run Code Online (Sandbox Code Playgroud)

但是,当将上述命令分配给变量时,它似乎不起作用:

$ result=`echo "hello;" | sed 's/\([^\\]\);/\1\\;/g'`
$ 
$ echo $result
hello; 
$
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

我尝试使用带引号和不带引号括起来的值,但这没有帮助。任何线索都非常感激。

顺便说一句,我首先认为字符串末尾的分号在某种程度上充当了终止符,因此 shell 不会继续执行sed(如果这有意义的话)。然而,这似乎不是问题。我尝试在字符串末尾(介于两者之间的某个位置)使用分号。我仍然看到与以前相同的结果。那是,

$ echo "hel;lo" | sed 's/\([^\\]\);/\1\\;/g'
hel\;lo
$
$ result=`echo "hel;lo" | sed 's/\([^\\]\);/\1\\;/g'`
$
$ echo $result
hel;lo
$
Run Code Online (Sandbox Code Playgroud)

Cha*_*ffy 5

sed您根本不需要(或任何其他正则表达式引擎):

s='hello;'
echo "${s//;/\;}"
Run Code Online (Sandbox Code Playgroud)

这是一个参数扩展,替换;\;

也就是说——你为什么要这么做?在大多数情况下,您不希望转义字符(属于语法)位于标量变量(属于数据)内;仅当您将数据解析为语法(例如使用 eval)时,它们才重要,出于其他原因,这是一个坏主意,最好避免(或以编程方式完成,如 via printf %q)。