【问题标题】:Unescape with pipeUnescape 与管道
【发布时间】: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

【问题讨论】:

    标签: bash sed pipe


    【解决方案1】:

    这似乎可以做到

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

    【讨论】:

    • 在 Mac OS X 上是 -E 而不是 -r
    • 这仅适用于转义的 ascii 字符,如空格、反斜杠等。如果它转义换行符、制表符或 unicode 值,它将不起作用
    【解决方案2】:

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

    cat foo.txt | read bar
    

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

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

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

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

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

    坚持重定向。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2010-10-11
        • 2021-06-28
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        • 2014-01-29
        • 2021-03-29
        相关资源
        最近更新 更多