Заменить слово после слова с добавочными значениями

У меня есть файл вроде этого –

! interface csa2549abA xxxx yyyy zzzz ! interface aso23apwoeAe aaa bbb ccc ! interface FastEthernet0/1 ppp qqq rrr ! 

и так далее.

Я хочу переименовать interfaces которые похожи на хеши, на нечто более согласованное, но не те, которые имеют смысл и делают вывод таким образом. Ключевое различие между теми, что имеет смысл, и теми, которые не делают, – это то, что хэши имеют числа между именем. Те, которые имеют смысл, всегда заканчиваются цифрами. Результат должен выглядеть следующим образом:

  ! interface ethernet1 xxxx yyyy zzzz ! interface ethernet2 aaa bbb ccc ! interface FastEthernet0/1 ppp qqq rrr ! 

и так далее. Каждый интерфейс представляет собой просто прирост значений термина ethernet . Также предположим, что есть несколько файлов, каждый из которых может быть взят как вход.

Теперь у меня есть sed -i 's/^interface .*$/interface Ethernet/' * но это просто заменяет значения каждого значения интерфейса Ethernet. Мне было интересно, есть ли команда просто увеличивать последнюю часть Ethernet чтобы представлять что-то вроде того, что я хочу.

Поскольку требуется арифметика, sed не является правильным инструментом. В приведенном ниже решении используется awk .

Ответ на пересмотренный вопрос

Вы говорите, что у нежелательных хэшей всегда есть имена, которые включают число, за которым следует письмо. В таком случае:

 $ awk '/^interface .*[[:digit:]][[:alpha:]]/{$0="interface ethernet" ++f} 1' file1 ! interface ethernet1 xxxx yyyy zzzz ! interface ethernet2 aaa bbb ccc ! interface FastEthernet0/1 ppp qqq rrr ! 

Как это работает:

  • /^interface .*[[:digit:]][[:alpha:]]/

    Это выбирает только те строки, которые начинаются с interface а также потом число, сопровождаемое буквой.

  • $0="interface ethernet" ++f

    Строки, выбранные, как указано выше, изменяются на interface ethernet и число, и число увеличивается каждый раз.

  • 1

    Это критическая стенограмма awk для печати.

Чтобы изменить файл на месте, предполагая, что вы используете современный GNU awk, используйте:

 awk -i inplace '/^interface .*[[:digit:]][[:alpha:]]/{$0="interface ethernet" ++f} 1' file1 

Ответ на оригинальный вопрос

 $ awk '/^interface /{$0="interface ethernet" ++f} 1' file ! interface ethernet1 xxxx yyyy zzzz ! interface ethernet2 aaa bbb ccc ! 

Чтобы изменить файл на месте и принять современный GNU awk, используйте:

 awk -i inplace '/^interface /{$0="interface ethernet" ++f} 1' file