鉴于此文件
$ 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'
是或否,取决于你的问题是什么意思。管道无法删除反斜杠,但如您所见,read
可以:
cat foo.txt | read bar
但是,这是对cat
AND 的无用使用,无论如何它都不会满足您的需求。
在 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 格式字符串,否则它将取消转义。