Это может удовлетворить ваши потребности:
awk '
fruits && /banana/ { $0 = "berry" }
/fruits/ { fruits = 1 }
/end fruits/ { fruits = 0 }
1
'
Приведенный выше код имеет БОЛЬШОЕ допущение: все в порядке, если между «фруктами» и «конечными фруктами» появляется «банан». Если вы просто хотите заменить «бананы», вы можете изменить действие следующим образом:
awk '
fruits && /banana/ { gsub( "banana", "berry" ) }
/fruits/ { fruits = 1 }
/end fruits/ { fruits = 0 }
1
'
Выше мы заменяем все «бананы» на «ягодные», в отличие от замены всей строки ($ 0 ). И теперь, так как мы используем gsub (), мы можем фактически удалить «&& / banana /», чтобы получить это:
awk '
fruits { gsub( "banana", "berry" ) } # if in fruits, do sub
/fruits/ { fruits = 1 } # weve entered the fruits block
/end fruits/ { fruits = 0 } # weve left the block
1 # print each line
'
luciole предлагает использовать диапазоны. Вот еще раз программа с использованием диапазонов (и устранением флага фруктов):
awk '
/fruits/,/end fruits/ { gsub( "banana", "berry" ) }
1
'
Используя диапазон выше, программа выглядит ОЧЕНЬ похожим на ответ Сайруса.