我有一个看起来像这样的文件:
some random
text
00ab46f891c2emore random
text
234324fc234ba253069
and yet more text
文件中只有一行只包含十六进制字符(234324fc234ba253069
),如何提取?我尝试sed -ne 's/^\([a-f0-9]*\)$/\1/p' file
我使用了行首和行结尾(^
和&
)作为分隔符,但我显然遗漏了一些内容......
答案 0 :(得分:2)
Grep完成这项工作,
$ grep '^[a-f0-9]\+$' file
234324fc234ba253069
通过awk,
$ awk '/^[a-f0-9]+$/{print}' file
234324fc234ba253069
根据给定的搜索模式,awk
和grep
打印匹配的行。
^ # 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 Script,printf "%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