#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]» в конце файла.