我有一个像这样的文件:
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
根据给定的搜索模式,awk
和grep
打印匹配的行。
^ # 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