【发布时间】:2013-05-02 07:09:24
【问题描述】:
鉴于此文件
$ cat foo.txt
\"That's funny, haha\"
我可以用read取消双引号
$ read bar < foo.txt
$ echo $bar
"That's funny, haha"
但是,这可以用管道完成吗?类似的东西
cat foo.txt | unescape
【问题讨论】:
鉴于此文件
$ cat foo.txt
\"That's funny, haha\"
我可以用read取消双引号
$ read bar < foo.txt
$ echo $bar
"That's funny, haha"
但是,这可以用管道完成吗?类似的东西
cat foo.txt | unescape
【问题讨论】:
这似乎可以做到
sed -r 's/\\(.)/\1/g'
【讨论】:
-E 而不是 -r
是或否,取决于您的问题的意思。管道无法删除反斜杠,但如您所见,read 可以:
cat foo.txt | read bar
不过,这是对cat 的无用使用,并且无论如何它都不会满足您的需求。
在 Bash 中,它具有附加的“功能”,即管道的每一侧都在自己的进程中运行。这意味着变量 (bar) 在调用进程中将不可用。所以,反斜杠将被删除,但它不会对你有一点好处。
是的,您可以设法捕捉它:
bar=$(cat foo.txt | { read bat;echo $bat;})
但这不仅看起来很糟糕,而且效率也很低。
坚持重定向。
【讨论】:
现在这是一个老问题,但我会添加这个答案,以便记录在这里,因为我有同样的问题,但在任何地方都找不到解决方案。我想出了这个适用于任何字符串转义序列的解决方案:
echo "" | gawk "{ print \"\`cat foo.txt\`\" }"
echo "" | gawk "{ print \"$(cat foo.txt)\" }"
echo "" | gawk "{ print \"$(< foo.txt)\" }"
它们都是同一操作的变体,请注意在第一个操作中使用了反引号。他们正在利用 gawk 的 print 命令完成的取消转义,并且仅限于单行输入文件(尽管我确信可以为多行输入制定更复杂的变体)。
请注意 cat foo.txt | gawk '{ printf $0 }',我认为它可能是一个解决方案,但它不起作用 - 似乎 gawk 不会取消转义其输入,即使将其用作 printf 格式字符串,否则它会取消转义。
【讨论】: