4

鉴于此文件

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

我可以取消双引号read

$ read bar < foo.txt

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

然而,这可以用管道完成吗?就像是

cat foo.txt | unescape
4

3 回答 3

6

这似乎做到了

sed -r 's/\\(.)/\1/g'
于 2013-05-02T08:22:46.427 回答
2

是或否,取决于你的问题是什么意思。管道无法删除反斜杠,但如您所见,read可以:

cat foo.txt | read bar

但是,这是对cat AND 的无用使用,无论如何它都不会满足您的需求。

在 Bash 中,这具有附加的“功能”,即管道的每一侧都在其自己的进程中运行。这意味着变量 ( bar) 在调用进程中将不可用。所以,反斜杠将被删除,但它不会对你有一点好处。

是的,你可以设法捕捉它:

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

但这不仅看起来很糟糕,而且效率低下。

坚持重定向。

于 2013-05-02T08:03:34.820 回答
0

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

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 格式字符串,否则它将取消转义。

于 2018-02-15T20:28:06.780 回答