С SED это можно сделать так:
sed -r 'h; s|(.*dn=([^&]+).*)|<li><a href="\1">\n</a></li>|; x; s//\2/; s/foo/bar/; G; s/(.*)\n(.*)\n(.*)/\2\1\3/' filename
То есть:
#!/bin/sed -rf
h # copy line to hold buffer
s|(.*dn=([^&]+).*)|<li><a href="\1">\n</a></li>| # generate the outer parts of
# the wanted result, with a
# newline where \2 will go
# when it was edited
x # exchange hold buffer and
# pattern space to bring back
# the input line
s//\2/ # isolate \2 (// reattempts the
# previous regex)
s/foo/bar/ # your substitutions here
G # append hold buffer to pattern
# space
s/(.*)\n(.*)\n(.*)/\2\1\3/ # rearrange the parts in the
# desired order.
Учитывая на вход
http://www.example.com/website.html?a=b&dn=foo&asd=fgh
это произведет
<li><a href="http://www.example.com/website.html?a=b&dn=foo&asd=fgh">bar</a></li>
Side Примечание: Так как ваш \1
является весь матч, было бы, возможно, будет лучше использовать &
в замене первого s
команды, т.е.
# v-- here
s|.*dn=([^&]+).*|<li><a href="&">\n</a></li>|
Это потребует s//\1/
вместо s//\2
в решение выше, так как группа захвата теперь \1
.
Я так не считаю. Используйте 'perl', чтобы вы могли получить обратную ссылку в переменной и обработать ее перед заменой. – Barmar
Но, может быть, если вы покажете примеры того, что вы хотите сделать, есть способ, уточняя регулярное выражение, чтобы получить части '\ 2' в разные обратные ссылки. – Barmar
это возможно, но вам нужно повторно выбрать группу в следующей подстановке или извлечь ее и повторно запустить ее позже (используя буфер хранения). Дайте образец. Теперь другие инструменты, возможно, лучше, как awk (или perl, например, @Barmar). Это будет сильно зависеть от желаемого действия – NeronLeVelu