使用sed te从文件中的单行提取ascii十六进制字符串

时间:2014-06-16 15:14:00

标签: bash shell sed hex ascii

我有一个看起来像这样的文件:

some random
text
00ab46f891c2emore random
text
234324fc234ba253069
and yet more text

文件中只有一行只包含十六进制字符(234324fc234ba253069),如何提取?我尝试sed -ne 's/^\([a-f0-9]*\)$/\1/p' file我使用了行首和行结尾(^&)作为分隔符,但我显然遗漏了一些内容......

3 个答案:

答案 0 :(得分:2)

Grep完成这项工作,

$ grep '^[a-f0-9]\+$' file
234324fc234ba253069

通过awk,

$ awk '/^[a-f0-9]+$/{print}' file
234324fc234ba253069

根据给定的搜索模式,awkgrep打印匹配的行。

^             # start
[a-f0-9]\+    # hex characters without capital A-F one or more times
$             # End

答案 1 :(得分:2)

sed可以成功:

sed -n '/^[a-f0-9]*$/p' file
234324fc234ba253069

顺便说一下,你的命令sed -ne 's/^\([a-f0-9]*\)$/\1/p' file对我有用。另请注意,没有必要使用\1进行打印。在许多情况下它很方便,但现在它太多了,因为你想要打印整条线。正如我在上面指出的那样,只需sed -n '/pattern/p'完成工作。

由于整个文件中只有一个匹配项,因此您可能希望在找到它后退出(thanks NeronLeVelu!):

sed -n '/^[a-f0-9]*$/{p;q}' file

另一种方法是让printf决定该行何时为十六进制:

while read line
do
    printf "%f\n" "0x"$line >/dev/null 2>&1  && echo "$line"
done < file

基于Hexadecimal To Decimal in Shell Scriptprintf "%f" 0xNUMBER如果数字确实是十六进制则成功执行。否则,它会返回错误。 因此,使用printf ... >/dev/null 2>&1 && echo "$line"不允许printf打印任何内容(重定向到/dev/null),但如果是十六进制则打印该行。

对于您的给定文件,它返回:

$ while read line; do printf "%f\n" "0x"$line >/dev/null 2>&1  && echo "$line"; done < a
234324fc234ba253069

答案 2 :(得分:1)

使用egrep,您可以限制正则表达式选择仅匹配有效十六进制字符的行,例如[a-fA-F0-9]

egrep '^[a-fA-F0-9]+$' file
234324fc234ba253069