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

У меня есть вертикальный файл, где каждое слово (токен) находится на отдельной строке в 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> , мы проверяем, установлен ли флаг; если это так, мы отобразим буфер. Наконец, каждая строка добавляется в наш буфер, независимо от того, установлен флаг или нет.

  • Как удалить узлы из файла HUGE (> 2gb)?
  • Как сгенерировать HTML-отчет nmap с помощью python?
  • Как получить определенную строку в xml с помощью python или perl и т. Д.
  • Код Perl для ссылки на несколько файлов одного и того же расширения (.xml)
  • конвертировать xml в csv
  • Инструмент командной строки XML-командной строки
  • Вставка текста между двумя шаблонами
  • Удалить строку с помощью> и forward-slash из xml-кода
  • поиск точной строки в unix
  • Заменить текст с помощью sed и сохранить часть исходного текста
  • Ошибка синтаксиса Openbox в ~ / .config / openbox / rc.xml
  • Interesting Posts

    Пароль SSH для пароля после настройки ключей ssh

    Укажите кодировку с помощью libreoffice –convert-to csv

    Синхронизация нескольких домашних папок с помощью Dropbox и символических ссылок

    Каламмер играет звуковые сигналы тревоги ogg, но не mp3

    Предотвращение случайного удаления каталогов. Создание псевдонима, содержащего параметры?

    Принудительная проверка fsck после перезагрузки с помощью одной команды

    Подсчитайте количество вхождений определенного числа перед каждой строкой в ​​linux

    Archlinux: modprobe: неверный параметр – 'l'

    Как проверить доступные версии пакетов в системах rpm?

    Как удалить карту-каталог и использовать символическую ссылку?

    Сценарии конфигурации VMware: могу ли я использовать PowerCLI?

    Получить PID создания файла

    Что такое «плохой список v: нет такого файла или каталога в / usr / libdata / per15 / OpenBSD / Pkg_Add.pm line 1115» означает?

    Какой .muttrc работает на Red Hat 5.11?

    Pipe diff файл в патч?

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