Jak usunąć wszystkie znaki inne niż ascii z jednego pliku? Czy byłoby jakieś specjalne polecenie, aby to zrobić?
grep --colour='auto' -P -n'[^\x00-\x7]' /usr/local/...
Wierzę, że znajdzie to znaki w przepływie pracy, ale jak mam usunąć wszystkie wystąpienia tych znaków?
text-processing
ascii
Mizole Ni
źródło
źródło
cat -v
znakami kontrolnymi (zamiast po cichu się ich pozbyć), możesz po prostu użyć, aby pokazać je w represantacji ASCII dla nich. (np.^G
dla\007
)Odpowiedzi:
Znaki ASCII to znaki z zakresu od 0 do 177 (ósemkowe) włącznie .
Aby usunąć znaki spoza tego zakresu w pliku, użyj
tr
Polecenie to narzędzie, które działa na pojedynczych znaków , albo zastępując je innymi pojedynczych znaków (transliteracji), usuwając je lub ściskania serie tego samego znaku w jednej postaci.Powyższe polecenie odczytuje
file
i zapisuje zmodyfikowaną treśćnewfile
.-d
Opcjatr
sprawia użytkowych znaków Delete (zamiast nich transliteracji) i-c
sprawia, że pod uwagę znaki poza danym przedziale (zamiast wewnętrznej).LC_ALL=C
upewnia się, że każda wartość bajtu stanowi poprawny znak. Bez tego niektóretr
implementacje przerwałyby się, gdyby znalazły sekwencje bajtów, które nie tworzą prawidłowych znaków w kodowaniu znaków ustawień regionalnych.Aby zastąpić oryginalny plik zmodyfikowanym, użyj
Spowoduje to zmianę nazwy nowego pliku na nazwę starego pliku po
tr
pomyślnym zakończeniu. Jeślitr
nie zakończy się pomyślnie, ponieważ nie można odczytać oryginalnego pliku lub nie zapisać do nowego pliku, oryginalny plik pozostanie niezmieniony.Alternatywnie, aby zachować jak najwięcej metadanych (uprawnień itp.) Oryginalnego pliku, użyj
źródło
Z
perl
źródło
Jeśli wszystko, czego potrzebujesz, to wyrażenie regularne:
[\x00-\x7F]
które możesz zastosować do kilku narzędzi:Zrozum, że sed, awk i perl oczekują „plików tekstowych” zdefiniowanych w Uniksie. W tym przypadku wszystko działa dobrze. Ale w szczególności awk dodaje końcową nową linię (niezależnie od tego, czy istniała w pliku źródłowym, czy nie) (użycie printf usuwa WSZYSTKIE nowe linie na wejściu). Tr jest przeznaczony do pracy z dowolnym typem pliku. Jednak NUL (
\0
) nie jest prawidłowym znakiem w pliku tekstowym POSIX i należy go unikać:W rzeczywistości wiele znaków kontrolnych generowałoby inne problemy w określonych warunkach.
Więc prawdopodobnie potrzebujesz
[\x07-\x0d\x20-\x7e]
Zakres 7-13 (dziesiętnie) to
\a\b\t\n\v\f\r
(w kolejności).Podobny (prawdopodobnie bardziej przenośny) zakres można zapisać jako
[^[:space:][:print:]] (similar because it doesn't include
\ a \ b` --bell i backspace--).Powiązane:
Regeksuj dowolny znak ASCII
Rozwiązanie Perl
Posix Plik tekstowy
źródło
tr
może być dowolny typ pliku, a nie tylko pliki tekstowe.awk
z drugiej strony pobiera plik tekstowy.gensub()
jest to rozszerzenie gawk. Chciałbyśgsub(...); print
i użyj ósemkowej zamiast sekwencji szesnastkowych (i LC_ALL = C), aby być (więcej) przenośnym.[^\o0]
polega na dopasowaniu znaków innych niż ukośnik odwrotny, o i 0 w POSIXsed
(we wszystkich implementacjach oprócz GNU sed). To nie jest ograniczenie GNU,sed
ale rozszerzenie niezgodne, dlatego jest ono wyłączone, gdy POSIXLY_CORRECT znajduje się w środowisku).