2009-08-03 3 views
14

это мой пример текстового файла:СЕПГ многострочный заменить

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

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

 
asdas 

this should be there 

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

Я попытался с помощью

патч в

SED -n '1h; 1 H;! $ {; Г; s /// < <] * TAG >>> // г; р;}' < test.txt

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

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

+0

В вашей продукции, вы уверены, что хотите пустую строку между Asdas и "это должно быть там? –

ответ

10

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

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

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

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

Это может быть упрощена с помощью другой разделитель:

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

Поиск в Google «sed one-liners» часто очень полезен - http://sed.sourceforge.net/sed1line.txt должен быть одним из первых результатов и содержит это среди многих других. – Cascabel

3

Вместо того, чтобы с помощью СЭД Решение, которое я дал, вы могли бы любой из них в Perl и AWK:

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

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

 
perl -ne 'print if !([email protected]^//<<<(.*)@ .. [email protected]^//$1>>>[email protected])' 
0

В дополнение поисковые разделители в sed может быть изменен путем побега первый разделитель:

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

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

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

попробует ... – rbawaskar

Смежные вопросы