Подстановочный знак SED выбирает слишком большой диапазон

Работа с Sed на Mac osx 10.6.8, создание файла .command с помощью текстового редактора, который будет выполняться в Geektool. У меня есть строка MYSTRING, и я пытаюсь удалить из нее теги ссылок. Но при использовании подстановочного знака Sed, кажется, выбирает слишком большой диапазон.

MYSTRING="<link>part_1</link>This part must remain.<link>part_x</link> Like this part."
echo $MYSTRING |
sed s/"<link>".*"<\/link>"//g

Я ожидал такого результата:

This part must remain. Like this part.

Но фактический результат таков:

 Like this part.

Кажется, что Sed берет первую ссылку как исходное значение, а последнюю /ссылку как исходное значение, в результате чего все промежуточное значение удаляется. Как мне заставить Sed понять, что он должен брать первую / ссылку после ссылки, а не последнюю?


person JiM_i    schedule 05.08.2012    source источник
comment
Вы всегда должны заключать интерполяции переменных в двойные кавычки; echo "$MYSTRING"   -  person tripleee    schedule 05.08.2012


Ответы (2)


Потому что .* жадный. Пытаться:

sed 's@<link>[^<]*</link>@@g'
person kev    schedule 05.08.2012

Поведение оператора повторения регулярного выражения * заключается в том, чтобы найти самое длинное и самое левое совпадение. К сожалению, sed не поддерживает скупое сопоставление, но Perl поддерживает:

perl -pe 's%<link>.*?</link>%%g'

или, может быть, вы можете сформулировать регулярное выражение, в котором жадное сопоставление не вызывает проблем;

sed 's%<link>[^<>]*</link>%%g'
person tripleee    schedule 05.08.2012