найти определенную строку и удалить всю структуру

У меня есть вертикальный файл, где каждое слово (токен) находится на отдельной строке в 4 столбцах. Существуют также метаструктуры <doc> , <s> , … Документы выглядят следующим образом:

 <doc name="sth" url="http"> <p> <s> Here here k1gInSc1 here is be k1gMnPc2 be aa k2eAgMnPc1d1 a sentence sentence k1gMnPc1 sentence <g/> . . kIx. </s> </p> </doc> 

проблема в том, что иногда есть неправильная кодировка с символами как Ă или Ä в первом столбце, например

 <doc name="sth" url="http"> <p> <s> Here here k1gInSc1 here is be k1gMnPc2 be Ă Ă k? Ă sentence sentence k1gMnPc1 sentence <g/> . . kIx. </s> </p> </doc> 

Мне нужно было бы найти эти символы и удалить всю структуру документа. Итак, если я найду Ă на строке, мне нужно удалить все содержимое между <doc...> всеми строками </doc> .

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

Я использовал grep для поиска плохих персонажей:

 xzcat file.vert.xz | grep -i "Ă\|Ĺ\|ľ\|ş\|Ä" > file_bad_characters.txt 

Как я могу обнаружить эти символы и удалить не только строку, но и весь текст между структурами <doc> .

2 Solutions collect form web for “найти определенную строку и удалить всю структуру”

Правильный способ сделать это – использовать правильный синтаксический анализатор XML. Однако в этом случае в качестве обходного пути может работать следующее:

  1. Удалите все пустые строки из файла:

     sed -i '/^\s*$/d' file 
  2. Добавьте пустую строку перед каждым <doc> :

     sed -i 's/<doc/\n\n<doc/' file 
  3. «Режим абзаца» пользователя Perl, где «строки» определяются как «абзацы» (разделы текста, которым предшествует пустая строка):

     perl -00 -ne 'print unless /[ĂĹľşÄ]/' file > newfile 

    Или, чтобы сделать замены в исходном файле:

     perl -i.bak -00 -ne 'print unless /[ĂĹľşÄ]/' file 

ВАЖНО : Это предполагает хорошо структурированный файл, где все находится внутри тегов <doc...

Боюсь, это не то, что вы можете сделать только с grep; это требует, чтобы вы сохраняли некоторый контекст о строках, которые grep не может предоставить. Однако есть несколько других языков, которые могут это сделать; вот пример с awk :

 awk '/<doc>/ {text=""; output=1} /Ă|Ĺ|ľ|ş|Ä/{output=0} {text = text $0 "\n"} /<\/doc>/ {if(output==1){printf "%s", text}}" 

Это создает буфер, называемый text когда мы видим токен <doc> во вводе и устанавливаем флаг, чтобы сигнализировать, что мы хотим видеть напечатанный текст; этот флаг очищается, когда встречаются запрещенные символы. Когда мы сталкиваемся с токеном </doc> , мы проверяем, установлен ли флаг; если это так, мы отобразим буфер. Наконец, каждая строка добавляется в наш буфер, независимо от того, установлен флаг или нет.

  • Измените несколько строк файла XML с помощью командной строки
  • Как преобразовать общий формат XML-формата в формат свойств String из XML-файла с помощью скрипта ksh
  • Добавьте содержимое файла XML другому, используя скрипт bash
  • Как получить список значений соответствия атрибутов с помощью xmllint и xpath?
  • Как получить определенную строку в xml с помощью python или perl и т. Д.
  • Прокрутите только архив данных .zip только для чтения, чтобы извлечь строку из файла .kml в
  • Как подсчитать узлы и получить значение атрибута без использования xpath
  • Найти пустой тег в `xml` с помощью команды Unix
  • фильтровать текстовый файл xml
  • конвертировать CDA XML в PDF без * TeX?
  • Как grep блок xml в XML-файле с использованием ключевого слова в ksh
  • Interesting Posts

    Является ли mkdir -p полностью безопасным при создании папки уже

    сеанс .ksh зависает после того, как он неактивен

    Установите скрипты инициализации вручную в Debian Wheezy

    Проблемы с crontab CentOS 7 – не обрабатывать рабочие места

    Как правильно вызвать lsof для получения всех TCP-соединений?

    Сообщение об ошибке: неизвестный пользователь 'geoclue' в файле statoverride

    pam_unix (sudo: auth): auth не смог идентифицировать пароль для

    Перебирайте строки файла, файла раздела и классифицируйте каждый раздел

    Неудачное решение от «Как перенаправить stdout и stderr в файл и отобразить stderr для консоли»

    Игрок или плагин, который может транслировать аудио в субтитры в реальном времени

    Использование sed для сопоставления нескольких возможных сред в файле

    Настройка просвещенного звукового демона

    Управление заданиями cron на нескольких серверах

    Сбой подключения к SSH

    Файл поврежден / потерян во время передачи? Возможно ли восстановление?

    Linux и Unix - лучшая ОС в мире.