Подстановочный знак 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
не поддерживает скупое сопоставление, но Perl:
perl -pe 's%<link>.*?</link>%%g'
или, может быть, вы можете сформулировать регулярное выражение, где жадное сопоставление не вызывает проблем;
sed 's%<link>[^<>]*</link>%%g'