我正在尝试通过命令行以最高效的方式将“Hello”转换为十六进制格式的48 65 6c 6c 6f
。
我尝试使用printf
和谷歌搜索,但是没有取得任何进展。
非常感谢您的帮助。
提前致谢。
我正在尝试通过命令行以最高效的方式将“Hello”转换为十六进制格式的48 65 6c 6c 6f
。
我尝试使用printf
和谷歌搜索,但是没有取得任何进展。
非常感谢您的帮助。
提前致谢。
echo -n "Hello" | od -A n -t x1
解释:
如果您想要做到这一点并去除空格,您需要执行以下操作:
echo -n "Hello" | od -A n -t x1 | sed 's/ *//g'
sed
是一个stream editor。s
是substitute命令。/
打开正则表达式——任何字符都可以使用。/
是传统的,但对于处理XML或路径名等内容来说不太方便。/
或您选择的替代字符,关闭正则表达式并打开替换字符串。/ */
中,*
匹配前一个字符(在本例中是空格)的任何序列。/
或您选择的替代字符,关闭替换字符串。在这种情况下,替换字符串//
为空,即删除匹配项。g
是执行此替换的选项,在每行上进行全局替换,而不仅仅是每行一次。sed
,即一个sed
脚本。@TMS的想法(sed 's/^ *//'
)仅从每行开头删除空格(^
匹配行的开头——在sed
中称为“模式空间”)。
如果您还想删除换行符,则最简单的方法是追加
| tr -d '\n'
对于命令管道,使用|
将之前处理过的流输入到该命令的标准输入中。其中tr
是翻译命令,-d
指定删除匹配的字符。引号中列出了您要匹配的字符列表 - 在这种情况下只有换行符(\n
)。翻译只匹配单个字符,而不是序列。
sed
在处理换行符时具有独特的缺陷。这是因为sed
是最早的unix
命令之一 - 它是在人们真正知道自己在做什么之前创建的。普遍存在的遗留软件使其无法修复。我知道这是因为我比unix
还要老。
问题的历史起源是换行符是行分隔符而不是行的一部分的想法。因此,它被行处理实用程序剥离并由输出实用程序重新插入。问题在于,这样做对用户数据结构进行了假设,并在许多设置中施加了不自然的限制。 sed
无法轻松地删除换行符是那种畸形思想造成痛苦的最常见的例子之一。
有可能使用sed
删除换行符,只是我所知道的所有解决方案都使sed
一次处理整个文件,这会导致处理非常大的文件时出现问题,从而破坏了流编辑器的目的。任何保留行处理的解决方案(如果可能的话)都将是多个管道的难以阅读的麻烦事。
如果您坚持使用sed
,请尝试以下方法:
sed -z 's/\n//g'
-z
选项告诉sed
使用null作为行分隔符。
在C
中,字符串以null结尾。-z
选项也是一种传统遗留,方便C
程序员使用一个由C
字符串填充的临时文件,不受换行符干扰。然后他们可以轻松读取和处理一个字符串。但是,早期关于使用案例的假设对用户数据施加了人为限制。
如果省略g
选项,则此命令仅删除第一个换行符。使用-z
选项,sed
将整个文件解释为一行(除非文件中有零散的null),以null结尾,因此它可能无法处理大型文件。
您可能会想:
sed 's/^/\x00/' | sed -z 's/\n//' | sed 's/\x00//'
\n\x00
结尾的每一行。第二条命令从每一行中删除一个换行符,现在由空值分隔 - 由于第一条命令,只会有一个换行符。所有多余的空值都会被保留。到目前为止还不错。这里破碎的想法是,管道将以逐行方式馈送最后一个命令,因为这就是流的构建方式。实际上,最后一个命令仅仅会删除一个空值,因为现在整个文件没有换行符,因此只有一行。
简单的管道实现使用中间临时文件,并且所有的输入都会被处理并提供给该文件。下一个命令可以在另一个线程运行,同时读取该文件,但它只会看到整个流(虽然不完整),并且没有意识到馈送文件的块边界。即使管道是内存缓冲,下一个命令也会将流视为整体。这个缺陷被不可避免地融入了 sed
中。
要使此方法起作用,您需要在最后一个命令上使用 g
选项,因此,它会在处理大文件时出现问题。
底线是:不要使用 sed
处理换行符。
-v
调用od
,以避免重复字符被抑制。 - Martinecho hello | hexdump -v -e '/1 "%02X "'
echo hello | hexdump -v -e '/1 "%02X"'
如果您不需要空格 - pdemecho -n hello | hexdump -v -e '/1 "%02X"' | xxd -r -p
- smalersecho -n "Hello" | od -A n -t x1 | sed 's/ /%/g'
%48%65%6c%6c%6f
-v
调用od
,以避免重复字符被抑制。 - Martin结合TMS和i-always-rtfm-and-stfw的答案,以下命令可在Windows下使用gnu-utils版本的'od'、'sed'和'tr'程序:
echo "Hello"| tr -d '\42' | tr -d '\n' | tr -d '\r' | od -v -A n -tx1 | sed "s/ //g"
或者在CMD文件中:
@echo "%1"| tr -d '\42' | tr -d '\n' | tr -d '\r' | od -v -A n -tx1 | sed "s/ //g"
"tr -d '\42'" removes quote marks that the Windows 'echo' will include.
"tr -d '\r'" removes the carriage return, which Windows includes as well as '\n'.
The pipe (|) character must follow immediately after the string or the Windows echo will add that space after the string.
There is no '-n' switch to the Windows echo command.
-v
调用od
,以避免重复字符被抑制。 - Martin