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///‹‹]*TAG>>>//g;p;}' ‹ test.txt

Но каким-то образом это не дало правильного вывода. Второй тег, содержащий символ «>», не удался в регулярном выражении. Не уверен, где я иду не так?

Любая идея, как это сделать?


person rbawaskar    schedule 03.08.2009    source источник
comment
В вашем выводе вы уверены, что вам нужна пустая строка между asdas и «это должно быть там»?   -  person William Pursell    schedule 03.08.2009


Ответы (3)


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

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

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

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

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

sed '@^//<<<@,@^//.*>>>@d'
person William Pursell    schedule 03.08.2009
comment
Поиск в Google однострочников sed часто бывает очень полезным — sed.sourceforge.net/sed1line.txt должен быть одним из первых результатов и содержит этот среди многих других. - person Cascabel; 03.08.2009

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

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

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

perl -ne 'print if !( m@^//<<<(.*)@ .. m@^//$1>>>$@ )'
person William Pursell    schedule 03.08.2009

Кроме того, разделители поиска в sed можно изменить, экранировав первый разделитель:

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

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

awk -F'//<<<|//|>>>' '$2{p=$2; while(getline && p!=$2); next}1' file
person Scrutinizer    schedule 08.03.2013