Удаление не отображаемых символов из файла - PullRequest
3 голосов
/ 22 августа 2010
$ cat weirdo 
Lunch now?
$ cat weirdo | grep Lunch
$ vi weirdo
  ^@L^@u^@n^@c^@h^@ ^@n^@o^@w^@?^@

У меня есть несколько файлов, которые содержат текст с некоторыми непечатными символами, такими как ^@, что приводит к сбою моих grep (как указано выше).

Как я могу получить grep Работа?Есть ли способ, который не требует изменения файлов?

Ответы [ 4 ]

6 голосов
/ 22 августа 2010

Похоже, ваш файл закодирован в формате UTF-16, а не в 8-битном наборе символов.'^ @' - это нотация для ASCII NUL '\ 0', которая обычно портит сопоставление строк.

Одним из методов обработки без потерь является использование фильтра для преобразования UTF-16 в UTF.-8, а затем с помощью grep на выходе - гипотетически, если бы команда была 'utf16-utf8', вы бы написали:

utf16-utf8 weirdo | grep Lunch

Как ужасно грубое приближение к 'utf16-utf8', вы могли бы рассмотреть:

tr -d '\0' < weirdo | grep Lunch

Это удаляет символы ASCII NUL из входного файла и позволяет grep работать с выводом 'cleaned'.Теоретически, это может дать вам ложные срабатывания;на практике это, вероятно, не будет.

5 голосов
/ 22 августа 2010

Для этого создана команда tr:

cat weirdo | tr -cd '[:print:]\r\n\t' | grep Lunch
2 голосов
/ 22 августа 2010

можно попробовать

awk '{gsub(/[^[:print:]]/,"") }1' file 
2 голосов
/ 22 августа 2010

У вас может быть некоторый успех с инструментом strings(1), как в:

strings file | grep Launch

Подробнее см. man strings.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...