Я пытаюсь использовать sed для извлечения части значения одной из множества пар ключ-значение в строке запроса URL
Вот что я пытаюсь:
echo 'http://www.youtube.com/watch?v=abc&g=xyz' | sed 's@^https?://(www.)?youtube.com/(watch\\?)?.*?v(=|/)([a-zA-Z0-9\-_]*)(&.*)?$@$4@'
но он всегда выводит входной URL как есть.
Что я делаю неправильно?
Обновление 1
Чтобы уточнить некоторые вопросы:
- Регулярное выражение является более сложным, чем должно быть, потому что я также пытаюсь проверить правильность ввода и сгенерировать вывод, только если вход действителен. Так что более строгий матч.
- Желаемым выводом является значение ключа 'v' в строке запроса.
- Я не смог найти версию
sed
которую я использую, но она поставляется с Mac OS X (10.7.5). - В моей версии
sed
$ 1, $ 2 и т.д. Кажутся совпадениями, \1, \2 и т.д. Выдают ошибку:sed: 1: "s@^https?://(www.)?yout ...": \4 not defined in the RE
Не правильно!как я узнал позже. Извиняюсь за то, что вызвал путаницу.
Обновление 2
Обновили sed
RE, чтобы сделать его более конкретным, основываясь на предложении @slhck ниже, но проблема остается прежней.
Обновление 3
Исходя из man
страницы для этой версии sed
кажется, что это версия со вкусом BSD.