如何使用 echo 编写非 ASCII 字符?

Posted

技术标签:

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

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

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

echo ?? >> file

【问题讨论】:

【参考方案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: *** 上的脚本

【讨论】:

【参考方案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。根据我的经验,这不是真的。查看我使用十六进制、八进制或混合转义码 here 和 here 的一堆示例。当然,我的示例主要用于单引号 (') 和双引号 ("),它们是 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'

以上是关于如何使用 echo 编写非 ASCII 字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式和 Notepad++ 删除所有非 ASCII 字符?

如何从字符串中删除非 ASCII 字符?

如何判断字符串中是不是包含任何非 ASCII 字符?

如何在 Hadoop/PIG 中处理非 ASCII/亚洲/中文字符

如何在 Python 中打印非 ASCII 字符

Python:如何解决SyntaxError:非ASCII字符?