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)
sed您根本不需要(或任何其他正则表达式引擎):
s='hello;'
echo "${s//;/\;}"
Run Code Online (Sandbox Code Playgroud)
这是一个参数扩展,替换;为\;。
也就是说——你为什么要这么做?在大多数情况下,您不希望转义字符(属于语法)位于标量变量(属于数据)内;仅当您将数据解析为语法(例如使用 eval)时,它们才重要,出于其他原因,这是一个坏主意,最好避免(或以编程方式完成,如 via printf %q)。
| 归档时间: |
|
| 查看次数: |
12166 次 |
| 最近记录: |