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)