
Wie kann ich alle Zeichen > ASCII-Code 127 aus einer Datei anzeigen und entfernen?
Datei ist Unicode 16bit
UPDATE: Dennis hat es gelöst, aber es gibt eine interessante Diskussion über Zahlenbereiche.
Antwort1
Ein möglicher Ansatz wäre, die Datei in Hexadezimalziffern zu konvertieren, die nicht gewünschten Ziffernmuster zu entfernen und dann die Rückkonvertierung durchzuführen.
$ echo 'A Unicode character: [ñ]' | xxd -p | sed 's/c3b1//' | xxd -r -p
A Unicode character: []
Sie können anstelle von AWK oder eine andere Textbearbeitungstechnik verwenden sed
. Achten Sie auf mehrdeutige Sequenzen.
Lassen Sie mich wissen, ob dies Ihren Vorstellungen entspricht.
Antwort2
Rückblick auf diese Frage
Es sieht so aus, als hätte ich am Ende eine dieser Zeilen verwendet
(scheint Dennis‘ regulärer Ausdruck zu sein)
$ 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
oder das (scheint mein regulärer Ausdruck zu sein)
$ 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
Dies sind einige Kommentare dazu, wie ich es mit einigen Tests herausgefunden habe.
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}
und hier sind einige Tests, die zeigen, dass Regex funktioniert. Ich hatte sie in meine Frage eingefügt, als ich sie gelöst habe, aber ich hätte sie in eine Antwort einfügen sollen.
Hex-Zeichen insgesamt 85
$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "[0-9A-F]{4}" | wc -l
85
Insgesamt möchte ich 72
$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "00[0-7][0-F]" | wc -
l
72
Insgesamt, die ich nicht will, 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
Insgesamt, die ich nicht will, 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