/<autor>/,/<\/autor>/
не означает от слова <autor>
до слова </autor>
, вместо этого оно означает от строку, содержащую слово <autor>
до строку, содержащую слово </autor>
.Все ваши входные данные находятся в одной строке, поэтому ваша замена происходит во всем входном сигнале.
Никогда не используйте выражения диапазона в любом случае, поскольку они делают тривиальные задачи намного более короткими, но затем требуют полного переписывания или дублирования условий для чего-либо большего.Интересно.
В этом случае с GNU awk для мультисимвольных RS и RT это будет что-то вроде (не проверено, так как приведенный пример не подходит для полного тестирования):
awk -v RS='</?autor>' '!(NR%2){gsub(/href/,"authref")} {ORS=RT} 1' file
Это предполагает, что всегда есть совпадающие пары <autor>...</autor>
, и они не могут быть вложенными (<autor>...<autor>...</autor>...</autor>
) и что они не появляются в контекстах, отличных от желаемых тегов XML (например, они не появляются в строках или комментариях).