0

16 進文字の形式は<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

大なり記号と小なり記号をエスケープすると、単語の先頭と単語の境界の末尾を検索する一致が作成されます。これらのリテラル文字に一致させたい場合は、エスケープせずに使用してください。

また、文字クラスを使用して正規表現を簡素化できます。

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

一致していない他の非印刷文字がある可能性があります。Adam が提案したように、odまたはを使用hexdumpして、他に何が隠されているかを確認します。バイナリ ファイルは、 <EF>実際には文字が存在しない場合などに、出力用に表現されることがあります。値を持つバイトはですか0xEFsedそのようなバイナリ データは、 orではうまく機能しませんgrep

于 2012-05-02T02:58:25.317 に答える
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 に答える