【问题标题】:How do I write non-ASCII characters using echo?如何使用 echo 编写非 ASCII 字符?
【发布时间】:2010-10-14 01:23:42
【问题描述】:

如何使用 echo 写入非ASCII 字符?是否有转义序列,例如\012 或类似的东西?

我想将 ASCII 字符附加到文件中:

echo ?? >> file

【问题讨论】:

    标签: linux bash ascii echo non-ascii-characters


    【解决方案1】:

    简介

    echo -e 'toto\010\010ti'   # OUTPUTS: toti
    echo -e '\x41'             # OUTPUTS: A
    echo -e '\u03B1'           # OUTPUTS: α
    echo -e '\U1F413 <= \U1F1EB\U1F1F7' # OUTPUTS ? <= ??
    

    文档

    来自man bash > /BUILTIN/ > /^ *echo/

                  \0nnn  the eight-bit character whose value is the octal value nnn (zero  to
                         three octal digits)
                  \xHH   the eight-bit character whose value is the hexadecimal value HH (one
                         or two hex digits)
                  \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal
                         value HHHH (one to four hex digits)
                  \UHHHHHHHH
                         the Unicode (ISO/IEC 10646) character whose value is the hexadecimal
                         value HHHHHHHH (one to eight hex digits)
    

    链接

    • Ascii 列表:man ascii
    • Unicode list: StackOverflow 上的脚本

    【讨论】:

      【解决方案2】:

      您可以将 ANSI-C 引用与 echo 一起使用:

      echo $'\012' # octal
      
      echo $'\x0a' # hex
      

      【讨论】:

      • 正是我所需要的,因为这不仅适用于 echo,也适用于 mv。这与 xxd 结合以获得十六进制值,然后我可以将我错误编码的文件名重命名为它们必须是的。
      【解决方案3】:

      至少在我的情况下,我将非 ASCII 表示为 Unicode,但 printf "\x##" 不足以满足我的 2 字节解决方案,因此我改用了这种略有不同的语法:

      > printf "\u25ba"
      ►
      

      【讨论】:

        【解决方案4】:

        在我的终端上,

        printf '\012' >>output.txt
        

        适用于 ascii 字符的八进制表示和相应的十六进制:

        printf '\xA' >>output.txt
        

        命令

        echo -en '\012' >>output.txt
        

        但是,无法正常运行。只有十六进制似乎可以与 echo -e 一起使用。 -n 从 echo 中删除默认的额外换行符。

        【讨论】:

        • 我的问题实际上是关于如何将十六进制打印到终端 - 通过谷歌找到了这个,这很好地回答了我的问题。它也回答了提问者的问题。它应该得到更多的分数。
        • echo -en '\012' &gt;&gt;output.txt 在 Ubuntu 18.04 GNU bash v4.4.19 和 macOS mojave GNU bash 版本 3.2.57 上都非常适合我。如果您使用像 '\0101' (A) 这样的可见字符,则可视化会更容易一些。
        • Only hexadecimals seem to work with echo -e。根据我的经验,这不是真的。查看我使用十六进制、八进制或混合转义码 herehere 的一堆示例。当然,我的示例主要用于单引号 (') 和双引号 ("),它们是 ASCII 字符。
        【解决方案5】:

        使用

        echo -e "\012"
        

        【讨论】:

        • 这需要完全不符合 POSIX 的功能(不仅仅是扩展,而是规范主动禁止,它不允许使用除-n 之外的任何标志),如果设置了xpg_echo 标志,即使在 POSIX 模式下也不会受到 bash 的尊重。
        • 注意,格式为\0...。所以如果你想要八进制 101,你可以使用"\0101"echo -e 必须有前导零。
        【解决方案6】:

        如果您关心可移植性,您将放弃 echo 并使用 printf(1)

        printf '\012'
        

        【讨论】:

        • ...或者,如果从不受信任的来源 printf '%b' '\012' 获取转义序列,则尊重此类序列,但不尊重其他格式字符串内容。
        • 注意格式是\NNN,而不是\0...。所以如果你想要八进制 101,请使用 printf '\101',而不是 printf '\0101'
        猜你喜欢
        • 2012-01-04
        • 2011-11-25
        • 1970-01-01
        • 2015-03-30
        • 1970-01-01
        • 1970-01-01
        • 2014-04-22
        • 1970-01-01
        • 2017-10-06
        相关资源
        最近更新 更多