ворос атцам sed'a

spensnp

почему

$ echo 'href="aaa?bbb&ccc$ddd=eee.html"' | sed {'s/\(href="[^?=&$]*\)[?=&$]\(.*\.html"\)/\1_\2/g'}
href="aaa_bbb&ccc$ddd=eee.html"

делает только одну замену, хотя указан параметр g?
как добиться чтобы он заменил все символы "?=&$" за один проход?

disna

а чем такой вариант не устраивает?

serd:~$ echo 'href="aaa?bbb&ccc$ddd=eee.html"' | sed {'s/[?=&$]/_/g'}
href_"aaa_bbb_ccc_ddd_eee.html"

зы я не отец sed'а

spensnp

нужно сделать замену только внутри конструкции href="..."
и как-нить покороче

Ivan8209

Потому что ".*" из второй скобки съедает всё. Вплоть до ".html".
Тебе надо повторять твою подстановку, пока строка подходит под образец.
О последнем прочитаешь сам.
---
...Я работаю...

spensnp


$ echo 'href="aaa?bbb&ccc$ddd=eee.html"' | sed {': start; s/\(href="[^?=&$]*\)[?=&$]\(.*\.html"\)/\1_\2/g; t start;'}
href="aaa_bbb_ccc_ddd_eee.html"

Ivan8209

Работает только с погнутым sed, для переносимости надо писать:

sed -e '{' -e ': start;' -e 's/\(href="[^?=&$]*\)[?=&$]\(.*\.html"\)/\1_\2/g;' -e 't start;' -e '}'

---
...Я работаю...

spensnp

угу
и я еще не учел что он жадный
нужно так

sed {': start; s/\(href="[^"]*\)[?=&$]\([^"]*\.html"\)/\1_\2/; t start;'}

buka

а «*?» твой сед не берёт?

spensnp

это перловская фишка
Оставить комментарий
Имя или ник:
Комментарий: