Чтобы удалить не -ASCII-символы из текста, рассмотрите возможность использования tr
следующим образом:
LC_ALL=C tr -d -c '[:print:][:cntrl:]' <file.in >file.out
Два класса символов POSIX [:print:]
и [:cntrl:]
вместе охватывают все символы в диапазоне ASCII, и с помощью -c
мы просим tr
рассмотреть дополнительный набор к этому, т. е. все не -символы ASCII.. С помощью -d
мы просим tr
удалить символы в этом дополнительном наборе.
Мы устанавливаем LC_ALL
наC
(или POSIX
), чтобы класс символов [:print:]
соответствовал только символам в диапазоне ASCII от 32 до 126. В противном случае он может соответствовать печатным символам в местной локали, например ä
. Класс [:cntrl:]
соответствует символам в диапазоне от 0 до 31 и 127. С LC_ALL=C
эти два класса вместе охватывают символы от 0 до 127, которые являются символами ASCII.
Чтобы удалить целые строки, содержащие любые не -символы ASCII:
LC_ALL=C grep -v '[^[:print:][:cntrl:]]' <file.in >file.out
Выражение [^[:print:][:cntrl:]]
будет соответствовать одному символу, отличному от -ASCII. С помощью -v
мы просим grep
извлечь все строки, не , соответствующие этому выражению, т. е. извлечь строки, которые не содержат символов, отличных от -ASCII.
Эти две команды также можно выполнить с помощьюsed
:
Удалить не -символы ASCII:
LC_ALL=C sed 's/[^[:print:][:cntrl:]]//g' <file.in >file.out
Удалить строки с не -символами ASCII:
LC_ALL=C sed '/[^[:print:][:cntrl:]]/d' <file.in >file.out
Обратите внимание, что, как указывает Стефан в комментарии ,приведенные выше команды вернут вам текст, который содержит только символы ASCII, или, по крайней мере, символы, закодированные как ASCII (, в зависимости от кодировки файла ).
Совершенно другим подходом было бы использованиеiconv
:
iconv -c -t ascii file.in >file.out
При этом файл преобразуется в кодировку ASCII, при этом все символы (, а не строки ), которые невозможно преобразовать, просто удаляются.
Помимо использования классов, как это делает Кусалананда, вы также можете создать свой собственный диапазон на основе юникода. Проверьте эту справочную таблицу unicolde , чтобы найти символы, которые вам нравятся. С PCRE возможный способ «стандартных» символов + TAB будет:
grep -P '^[\x{0020}-\x{007e}\x{0008}]{1,}$' file
Обратите внимание, что символ новой строки \x{000A}
не включен в качестве управляющего символа из-за того, что grep
для каждой строки -функциональность (в стандартном режиме ). Учтите, что новые строки в стиле MS -будут затронуты, и используйте \x{000d}\x{000a}
для новых строк!