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