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

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

! 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 чтобы представлять что-то вроде того, что я хочу.

One Solution collect form web for “Заменить слово после слова с добавочными значениями”

Поскольку требуется арифметика, 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 
  • ssed -R по сравнению с perl -pe
  • Сценарий для извлечения выбранных записей из файла bibtex
  • Добавление последовательных символов для дублирования слов в соответствии с порядком их появления
  • Как переместить каждую группу строк в новый столбец?
  • Как заменить теги html командой SED?
  • Добавление символа в любую другую текстовую строку
  • Добавить строку суффикса в конец каждой строки?
  • Как grep все строки, где начальная строка заканчивается шаблоном, а конечная строка заканчивается другим?
  • Я хочу добавить «n» строк из файла (скажем, file1) в другой файл под «n» вхождения строки в другой файл, чтобы
  • Чтение заданных строк в файле - BASH
  • вставка в строку с помощью sed
  • Interesting Posts

    Запись вывода wget или curl в пользовательское имя файла на основе URL-адреса

    Добавить текст в командную строку через скрипт оболочки

    FreeBSD 9,1 – потребление процессора upowerd с крыши и заставляет ОС перезапускать

    Откройте результат `locate` с` vi`

    CentOS 7 cpupower не устанавливает максимальную мощность процессора

    Обычная практика совместного использования файлов для всех пользователей на одном компьютере?

    Бэш длинная строка, ни слова не разбивается?

    Клавиатура USB (HID) не отвечает в Linux, а в grub

    Как преодолеть эту ошибку при запуске скрипта в crontab?

    Как восстановить Debian из LK backports, где конфликт уровня запуска?

    Несмотря на все попытки, вентилятор все еще работает очень громко и быстро

    Какие преобразования данных используют параметр -data curl?

    суперпользователя или пользователя?

    Система распознает порт USB 3.0 как порт USB 2.0

    Закрытая сеть DHCP + DNS – обновление сборочной стороны in-addr.arpa, передняя сторона отказывается обновлять

    Linux и Unix - лучшая ОС в мире.