Удалить две строки с помощью sed, если между ними нет текста

#awk #sed

#awk #sed

Вопрос:

у меня есть файл, содержащий следующий текст:

 [Data]

hi

[Data]

one two three

[Data]

[Data]

right left

[Data]

[Data]
  

Я ищу, как получить этот вывод из sed, awk или чего-то еще:

 [Data]

hi

[Data]

one two three

[Data]

right left
  

Объяснение: мне нужно посмотреть, нет ли текста между [Data] и [Data], если он не содержит текста, мне нужно удалить строку [Data] и следующую пустую строку.

Вы можете мне помочь? большое спасибо!

Ответ №1:

В названии указано sed , но оно также помечено awk , так что попробуйте:

 awk '$0==s amp;amp; p==$0{next} {p=$0}1' s="[Data]" file
  

Предполагается, что в каждой другой строке в выборке реальных данных нет пустых строк.

Ответ №2:

Это может сработать для вас (GNU sed):

 sed ':a;$!{N;s/n/amp;/3;Ta};/^[Data][^n]*nn[^[][^n]*n$/b;s/n//;D' file
  

Это сохраняет скользящее окно из 4 строк в пространстве шаблонов, и если ожидаемый шаблон не найден, удаляет первые две строки, затем восстанавливает пространство шаблонов обратно до 4 строк и повторяется.

Комментарии:

1. Привет, потонг, это работает по желанию. Спасибо за ваше объяснение.

Ответ №3:

попробуйте это:

 sed ':a;N;$!ba;s/n/###/g' file | sed 's/######[Data]######[Data]/######[Data]/g' | sed 's/###/n/g'
  

Ответ №4:

Надеюсь, это будет полезно.

 sed ':a;/$/{N;s/n/#/;ba}' inputFile.txt|sed 's/]#*[Data]/]/g'|sed 's/#/n/g
  

Ответ №5:

Это делает то, что, по вашим словам, вы хотите сделать, используя GNU awk для многозначных RS и s сокращая для [[:space:]] :

 $ awk -v RS='^$' -v ORS= '{gsub(/[Data]s*[Data]/,"[Data]")}1' file
[Data]

hi

[Data]

one two three

[Data]

right left

[Data]
  

Я подчеркиваю «СКАЗАТЬ», потому что ваш опубликованный ожидаемый результат не соответствует вашему описанию того, что вы хотите сделать ( i need to look if between [Data] and [Data] have no text, if not contain text i need to delete the [Data] line and the next empty line. ), поскольку он также, похоже, удаляет строку «[Data]» в конце файла.