Подстановочный знак 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 принимает первую ссылку в качестве значения from, а последнюю / ссылку - в качестве значения, вызывая удаление всего промежуточного. Как заставить Седа понять, что он должен брать первую / ссылку после ссылки, а не последнюю?

2 ответа

Так как .* жадный Пытаться:

sed 's@<link>[^<]*</link>@@g'

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

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

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

sed 's%<link>[^<>]*</link>%%g'
Другие вопросы по тегам