sed многострочная замена

Это мой образец текстовый файл :

asdas
//<<<TAG
this should be removed
//TAG>>>
this should be there
//<<<TAG
T
>
asd
asd
//TAG>>>

для которого я хочу o / p как:

asdas

this should be there

в основном я пытаюсь найти строки между "/ / > " (включая эти строки тоже) и удалить их.

Я попытался использовать sed

sed-n '1h; 1!H;${; g; s///>>/ / g; p;}'

но некоторые, как он не произвел правильного вывода. Второй тег, который содержал символ">", не удался в регулярном выражении. Не знаю, где я. что-то не так?

есть идеи, как это сделать ?

3 ответов


Если вы пытаетесь удалить строки с буквальным текстом "TAG", попробуйте:

sed '/\/\/<<<TAG/,/\/\/TAG>>>/d'

из ваших комментариев кажется, что тег может быть не буквальным, в этом случае:

sed '/^\/\/<</,/^\/\/.*>>/d'

Это можно упростить, используя другой разделитель:

sed '@^//<<<@,@^//.*>>>@d'

вместо использования решения sed, которое я дал, вам может понравиться любой из них в perl и awk:

perl -ne 'print if !( m@//<<<TAG@ .. m@//TAG>>>@ )'
awk '/\/\/<<<TAG/,/\/\/TAG>>>/ {next} 1'

учитывая, что я думаю, что вы действительно не хотите, чтобы тег был константой, самым чистым решением, которое я знаю, является вариант perl:

perl -ne 'print if !( m@^//<<<(.*)@ .. m@^//>>>$@ )'

кроме того, разделители поиска в sed можно изменить, избегая первого разделителя:

sed '\|^//<<<|,\|^//.*>>>|d' file

Awk версия соответствует концу с тем же именем тега:

awk -F'//<<<|//|>>>' '{p=; while(getline && p!=); next}1' file