与管道的Unescape

时间:2013-05-02 07:09:25

标签: bash sed pipe

鉴于此文件

$ cat foo.txt
\"That's funny, haha\"

我可以用read

取消双引号
$ read bar < foo.txt

$ echo $bar
"That's funny, haha"

然而,这可以通过管道完成吗?像

这样的东西
cat foo.txt | unescape

3 个答案:

答案 0 :(得分:6)

这似乎是这样做的

sed -r 's/\\(.)/\1/g'

答案 1 :(得分:2)

是或否,取决于您的问题的含义。管道无法删除反斜杠,但正如您所见,read可以:

cat foo.txt | read bar

然而,这是对cat无用的使用而且无论如何它都不会做你需要的。

在Bash中,这有一个额外的“功能”,即管道的每一侧都在它自己的进程中运行。这意味着变量(bar)在调用进程中不可用。因此,反斜杠将被删除,但它不会对你有所帮助。

是的,你可以设法抓住它:

bar=$(cat foo.txt | { read bat;echo $bat;})

但这看起来并不可怕,也是效率低下的。

坚持重定向。

答案 2 :(得分:0)

这是一个古老的问题,但是我会添加这个答案,以便它在这里作为记录,因为我有同样的问题,无法在任何地方找到解决方案。我想出了适用于任何字符串转义序列的解决方案:

timestamp

他们是同一操作的所有变体,并注意在第一个操作中使用反引号。他们正在利用gawk的打印命令完成的unescaping,并且仅限于一行输入文件(尽管我确信可以为多行输入设计更复杂的变体)。 / p>

请注意echo "" | gawk "{ print \"\`cat foo.txt\`\" }" echo "" | gawk "{ print \"$(cat foo.txt)\" }" echo "" | gawk "{ print \"$(< foo.txt)\" }" ,我认为它可能是一个解决方案,并不起作用 - 似乎gawk不会忽略它的输入,即使它被用作printf格式字符串,否则它将无视。