鉴于此文件
$ cat foo.txt
\"That's funny, haha\"
我可以用read
$ read bar < foo.txt
$ echo $bar
"That's funny, haha"
然而,这可以通过管道完成吗?像
这样的东西cat foo.txt | unescape
答案 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格式字符串,否则它将无视。