0

十六进制字符的形式为<9F>. 它们周围有很多数据,但我只对正确使用正则表达式感兴趣,因此我可以从表中删除这些sed数据,然后重新导入数据库。

这是我到目前为止所尝试的:

egrep -io '\<[0-9A-Fa-f]{2}\>' /root/database.sql

和几个变化。我似乎无法让它工作,我不知道为什么。我也尝试过双重/三重转义和分组。它找到了字符对,但没有找到< >'s

所以它给出这样的输出:

39
48
69
6F
B9

但我需要它来获得完整的

<39>
<48>
<69>
<6F>
<B9>
4

3 回答 3

1

我敢打赌,这些字节超出了终端可以显示的范围(控制字符或多字节字符串)。

首先,我必须问您是否绝对确定要从数据库中清除它(毕竟有人可能会想要插入一条带有“über”或其他词的记录)。此外,我还看到一些数据库在 DB 转储文件中使用控制字符作为分隔符(我想到了 Ingres)

如果您仍然想清理数据,那么可以试试这个:

perl -npe 'tr/\001-\177/cd'

我在平板电脑上输入这个,所以我不能仔细检查,但这应该会删除 7 位 ASCII 范围之外的任何字符。

于 2012-05-02T09:07:11.617 回答
0

这对我有用:

$cat testfile
<39> <48>
<60><6F><a4>

$egrep -io '<[0-9A-Fa-f]{2}>' testfile

<39>
<48>
<60>
<6F>
<a4>
于 2012-05-02T02:21:28.987 回答
0

转义小于和大于符号使匹配查找单词的开头和单词的结尾边界。如果您想匹配这些文字字符,请使用未转义的字符。

此外,您可以使用字符类来简化正则表达式。

grep -E '<[[:xdigit:]]{2}>'

您可能还有其他不匹配的非打印字符。正如亚当建议的那样,使用odorhexdump来查看可能隐藏的其他内容。二进制文件有时被表示为输出使用,例如, <EF>这些字符实际上并不存在。什么会有一个具有值的字节0xEF。像这样的二进制数据不适用于sedor grep

于 2012-05-02T02:58:25.317 回答