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



我有一个像这样的文件:

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

文件中只有一行只包含十六进制字符(234324fc234ba253069),我如何提取?我尝试了sed -ne 's/^([a-f0-9]*)$/1/p' file,我使用行开始和行结束(^&)作为分隔符,但我显然缺少一些东西…

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

sed可以做到:

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

顺便说一下,你的命令sed -ne 's/^([a-f0-9]*)$/1/p' file对我有效。还请注意,没有必要使用1来打印回。它在很多情况下都很方便,但是现在它太多了,因为您想要打印整行。正如我上面所指出的,只有sed -n '/pattern/p'可以完成这项工作。

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

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

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

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

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

对于给定文件,它返回:

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

使用egrep,你可以限制你的regex选择只匹配有效十六进制字符的行,即[a-fA-F0-9]:

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

最新更新