在bash中转义字符串的命令


97

我需要一个bash命令,它将字符串转换为转义的东西。这是一个例子:

echo "hello\world" | escape | someprog

转义命令"hello\world"进入的位置"hello\\\world"。然后,someprog可以"hello\\world"按预期使用。当然,这是我将要做的事情的简化示例。


5
逃生的本质是什么?换句话说,哪些字符需要转义?您是否正在寻找一个C ++ -风格的转义(其中选项卡由\ t取代,\ n换行,用\”行情等),这是很难帮助没有问题被明确定义。
迈克尔·亚伦Safyan


这个问题可能意味着十几种不同的东西。除了让我们猜测外,如果您确切说明要寻找的转义形式,这会有所帮助。
唐·哈奇

1
该问题特定于对\使用\\。有一个可接受的答案。
User1

Answers:


154

在Bash中:

printf "%q" "hello\world" | someprog

例如:

printf "%q" "hello\world"
hello\\world

也可以通过变量使用它:

printf -v var "%q\n" "hello\world"
echo "$var"
hello\\world

6
请注意,%q直到2012年左右,他已经破产了十多年~。也有便携式sed单层烟囱stackoverflow.com/a/20053121/1073695
Jo So

1
sed确实更好,因为它也可以逃脱美元符号
撤消

2
@untore:a='abc$def":'; printf '%q\n' "$a"结果abc\$def\":(美元符号被转义)。这是Bash 4.3(我在Bash 3.2中得到了相同的结果)。您使用什么版本?
暂停,直到另行通知。

3
为了逃避美元符号,请改用单引号,例如:printf "%q" 'he$l&lo\world'
LeandroCR

bash的printf '%q\n' text引号采用bash格式(和当前语言环境)格式的文本,因此,只有在OP someprog具有完全相同的引号语法bash(极不可能)的情况下,这才适用于OP 。
Stephane Chazelas

9

纯Bash,使用参数替换:

string="Hello\ world"
echo ${string//\\/\\\\} | someprog

1
这样,“ hello world”就不会逃脱到“ hello \ world”-公认的答案是printf方法。
vchrizz

1
另外,“%q”不会像“ 03/25/2017”中那样转义为“ /”,我需要将其转义为“ 03 \ / 25 \ / 2017”(这样它就可以以'/'分隔)表达)。
wrlee

0

您可以使用perl替换各种字符,例如:

$ echo "Hello\ world" | perl -pe 's/\\/\\\\/g'
Hello\\ world

根据转义的性质,您可以链接多个呼叫以转义适当的字符。


1
为什么不sed?$ echo“ hello \ world” | sed's / \\ / \\\\\ /'
空间

1
@Octopus,这也是一个有效的选项。我碰巧对perl较为满意,但是,对,这也可行。
Michael Aaron Safyan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.