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

Не знаю, будет ли это ответом, потому что ls написан на C, но вы можете написать сценарий оболочки для выполнения "ls", используя цикл for:

for f in *;do echo $f; done

Это также полезно в некоторых статических оболочках...

3
03.03.2017, 14:49
2 ответа

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

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

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

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

     perl -00 -ne 'печатать, если /[ĂĹľşÄ]/' файл > новый файл
     

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

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

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

2
27.01.2020, 21:18

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

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

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

2
27.01.2020, 21:18

Теги

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