Как указать [любой символ] в SED?

используйте приведенный ниже:

ip r | grep default
1
28.01.2021, 11:08
2 ответа

Чтобы удалить не -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, при этом все символы (, а не строки ), которые невозможно преобразовать, просто удаляются.

1
18.03.2021, 22:34

Помимо использования классов, как это делает Кусалананда, вы также можете создать свой собственный диапазон на основе юникода. Проверьте эту справочную таблицу unicolde , чтобы найти символы, которые вам нравятся. С PCRE возможный способ «стандартных» символов + TAB будет:

 grep -P '^[\x{0020}-\x{007e}\x{0008}]{1,}$' file

Обратите внимание, что символ новой строки \x{000A}не включен в качестве управляющего символа из-за того, что grepдля каждой строки -функциональность (в стандартном режиме ). Учтите, что новые строки в стиле MS -будут затронуты, и используйте \x{000d}\x{000a}для новых строк!

0
18.03.2021, 22:34

Теги

Похожие вопросы