Jak mogę wyświetlić i usunąć wszystkie znaki> kod ascii 127 z pliku?
plik ma format 16bit
AKTUALIZACJA Dennis rozwiązał go, ale istnieje interesująca dyskusja na temat zakresów liczb.
Jak mogę wyświetlić i usunąć wszystkie znaki> kod ascii 127 z pliku?
plik ma format 16bit
AKTUALIZACJA Dennis rozwiązał go, ale istnieje interesująca dyskusja na temat zakresów liczb.
Odpowiedzi:
Jednym z podejść byłoby przekonwertowanie pliku na cyfry szesnastkowe, usunięcie niepotrzebnych wzorów cyfr, a następnie konwersja z powrotem.
$ echo 'A Unicode character: [ñ]' | xxd -p | sed 's/c3b1//' | xxd -r -p
A Unicode character: []
Zamiast niego możesz użyć AWK lub innej techniki manipulacji tekstem sed. Uważaj na niejednoznaczne sekwencje.
Daj mi znać, jeśli podejdzie to do tego, co masz na myśli.
Patrząc wstecz na to pytanie
Wygląda na to, że ostatecznie użyłem jednej z tych linii
(wydaje się być wyrażeniem regularnym Dennisa)
$ 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
lub to (wydaje się być moim wyrażeniem regularnym)
$ 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
to jest komentarz na temat tego, jak to wypracowałem, z kilkoma testami.
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}
a oto kilka testów, które pokazują, że regex działa. Zadałem je, gdy je rozwiązałem, ale powinienem był udzielić odpowiedzi.
Łączne znaki szesnastkowe 85
$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "[0-9A-F]{4}" | wc -l
85
Ogółem, czego chcę, 72
$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "00[0-7][0-F]" | wc -
l
72
Suma, której nie chcę, 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
Suma, której nie chcę, 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
$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "00[0-7][0-F]" zamiast zastąpić te, których nie chciałem zachować z niczym. (to ostatnie oznacza znacznie dłuższy regex)