
ファイルから ASCII コード 127 を超えるすべての文字を表示して削除するにはどうすればよいですか?
ファイルはUnicode 16ビットです
更新 Dennis はそれを解決しましたが、数値の範囲について興味深い議論があります。
答え1
1 つの方法としては、ファイルを 16 進数に変換し、不要な数字パターンを削除してから、元に戻すという方法があります。
$ echo 'A Unicode character: [ñ]' | xxd -p | sed 's/c3b1//' | xxd -r -p
A Unicode character: []
の代わりに AWK またはその他のテキスト操作テクニックを使用することもできますsed
。あいまいなシーケンスには注意してください。
これがあなたの考えに近いかどうか教えてください。
答え2
この質問を振り返ってみると
結局、これらの行の1つを使用したようです
(デニスの正規表現のようです)
$ xxd -p a.q | tr -d '\n' | sed "s/([0-9a-f]\{4\})/\1 /g" | sed -r "s/(00[8-9a-f][0-9a-f]|[0-9a-f][1-9a-f][0-9a-f][0-9a-f]|[1-9a-f]0[0-9a-f][0-9a-f])//g" | tr -d ' ' | sed "s/(.*)/feff\1/" | xxd -r -p >a.q2
またはこれ(私の正規表現のようです)
$ xxd -p a.q | tr -d '\n' | sed "s/([0-9a-f]\{4\})/\1 /g" | sed -r "s/(00[89A-F][0-9A-F]|0[1-9A-F][0-9A-F]{2}|[1-9A-F][0-9A-F]{3})//g" | tr -d ' ' | sed "s/(.*)/feff\1/" | xxd -r -p >a.q2
これは、いくつかのテストを行いながら、私がどのように解決したかについての解説です。
0080-00FF 00[89A-F][0-9A-F]
0100-0FFF 0[1-9A-F][0-9A-F]{2}
1000-FFFF [1-9A-F][0-9A-F]{3}
正規表現が機能することを示すテストがいくつかあります。解決したときに質問にそれらを入れましたが、回答に入れるべきでした。
16進文字合計 85
$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "[0-9A-F]{4}" | wc -l
85
欲しい合計72
$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "00[0-7][0-F]" | wc -
l
72
欲しくないもの合計13
$ xxd -p -u a.aa.txt | sed -r "s/[0-9A-F]{4}/\0 /g" | grep -oP '((?!00[0-7][0-9A-F])(?=[^ ]).){4}' | wc -l
13
欲しくないもの合計13
$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "00[89A-F][0-9A-F]|0[1-9A-F][0-9A-F]{2}|[1-9A-F][0-9A-F]{3}" | wc –l
13