十六进制字符采用<9F>
的形式。它们周围有很多数据,但我只对正确使用正则表达式感兴趣,所以我可以从sed
的表中删除它们,然后重新导入数据库。
这是我到目前为止所尝试的内容:
egrep -io '\<[0-9A-Fa-f]{2}\>' /root/database.sql
还有几种变化。我似乎无法让它工作,我不知道为什么。我也尝试过双重/三重转义和分组。它找到了字符对,但找不到< >
的
所以它给出了这样的输出:
39
48
69
6F
B9
但我需要它来获得完整的
<39>
<48>
<69>
<6F>
<B9>
答案 0 :(得分:1)
我认为这些字节超出终端可以显示的范围(控制字符或多字节字符串)。
首先,我要问你是否绝对肯定你想要从数据基础中清除它(毕竟有人可能有反弹想要插入带有'über'或其他东西的记录)。此外,我已经看到一些数据库使用控制字符作为数据库转储文件中的独立者(Ingres浮现在脑海中)
如果你仍然想要清理数据,那么可以试试这个:
perl -npe'tr / \ 001- \ 177 / cd'
我在平板电脑上输入这个,所以我不能仔细检查,但是应该删除7位ASCII范围之外的任何字符。
答案 1 :(得分:0)
这对我有用:
$cat testfile
<39> <48>
<60><6F><a4>
$egrep -io '<[0-9A-Fa-f]{2}>' testfile
<39>
<48>
<60>
<6F>
<a4>
答案 2 :(得分:0)
转换小于和大于符号使匹配查找单词边界的开头和结尾。如果你想匹配那些文字字符,那么就不要使用它们。
此外,您可以使用字符类来简化正则表达式。
grep -E '<[[:xdigit:]]{2}>'
您可能还有其他未匹配的非打印字符。正如亚当建议的那样,使用od
或hexdump
来查看其他可能隐藏的内容。二进制文件有时使用例如<EF>
来表示输出,而实际上没有那些字符。 的内容将是一个具有值0xEF
的字节。这样的二进制数据不适用于sed
或grep
。