Удалите неанглийские и акцентированные символы из плоского файла с помощью сценария оболочки Unix - PullRequest
2 голосов
/ 01 марта 2011

У меня есть файл, который содержит много акцентированных и некоторых символов подстановки (?, *). Как заменить эти символы пробелом в Unix (используя sed или аналогичную утилиту). Я попробовал это с помощью sed, но почему-то он игнорирует акцентированные символы.

Спасибо

Ответы [ 3 ]

1 голос
/ 01 марта 2011

Это не очень конкретный ответ, но он должен дать вам несколько ключевых слов для поиска.

Во-первых, легкий бит.Это просто, чтобы sed соответствовало регулярному выражению символов.Например:

% echo 'one tw? f*ur' | sed 's/\*/ /' 
one tw? f ur
% echo 'one tw? f*ur' | sed 's/[*?]/ /'
one tw  f*ur
%

Обработка не-ASCII-символов более сложная.

Некоторые seds могут обрабатывать не-ASCII-символы, обычно файлы Unicode.Некоторые сида не могут.К сожалению, это не может быть очевидно из man-страницы вашего sed, какой она есть.Жизнь трудна.

Одна вещь, которую вы должны выяснить, - в какой кодировке находится входной файл. Файл Unicode будет кодирован в одном или другом из UTF-8 или UTF.-16 (или, возможно, один из нескольких менее распространенных).Это не место для расширения юникода и кодировок, но это ключевые слова для сканирования страниц справочника ...

Даже если вы не можете найти sed, который может обрабатывать юникод, тогда выможет быть в состоянии использовать perl, python или какой-либо другой язык сценариев для выполнения обработки - обычно они имеют механизмы регулярного выражения, которые могут выполнять Unicode.Опция perl -n создает неявный цикл, который может сделать нужное преобразование однострочным.

Если ваш входной документ находится в другой (не-Unicode) кодировке, такой как одна из ISO-8859, тогда я думаю, что лучше всего было бы преобразовать его в UTF-8, используя что-то вроде iconv, и продолжить с него.

1 голос
/ 01 марта 2011

Используя GNU sed, вы можете сделать следующее:

sed 's/[^\o51-\o57\o64-\o89\o96-\o105\o112-\o121\o128-\o137\o144-\o145\o147\o150\o291-\o293]/ /g' inputfile

Обратите внимание, что после обратной косой черты это буква "O", а не цифра ноль.

0 голосов
/ 01 марта 2011

Если ваши акцентированные символы являются однобайтовыми, вы можете использовать tr с наборами символов для достижения этой цели. Если вы можете определить диапазон символов для сопоставления, это, вероятно, проще всего:

tr '\192-\255' ' ' < infile > outfile

Если вы имеете дело с более чем 8-битными символами, awk и sed могут с этим справиться, но вам нужно убедиться, что ваши входные данные правильно указаны. Попробуйте использовать десятичное или шестнадцатеричное представление вместо самих символов.

...