Как заменить несколько букв в многострочном слове, состоящем из цифр и букв в определенном формате?

У меня есть файл, в котором я хочу изменить весь код, который имеет следующий формат: n{,3}L{,2}n{,5} where n= [0-9] any number and L [a-zA-Z] any letter either capital or not

Я хочу изменить A или a на AB и d или D в DK, что-то вроде этого:

  Annnnn--> ABnnnnn ; Dnnn-->DKnnn 

файл выглядит так:

 $ cat filename 123a67,64,xx A67990,12,ttt 89d7,34,ggg 234AB445,78,ooo 145aB7699,67,rrr 278Dk89,25,ppp 

Я попробовал следующий сценарий sed

 sed 's/[aA]/AB/g;s/[dD]/DK/g' filename 

он работает для экземпляров, которые имеют только A или D, но для тех, которые уже являются AB или DK, он добавляет букву как AB--> ABB or DK-->DKK . Любая помощь оценивается с объяснением. Благодаря!

  • Обратный grepping
  • Использовать awk, чтобы найти первое вхождение
  • Как добавить строку в файл .txt во всех строках, исключая несколько символов с помощью sed или awk
  • Как эхо из определенной строки файла в другую определенную строку
  • Редактируйте несколько строк из определенного раздела INI-файла
  • Форматировать вывод на определенную длину строки
  • Изменение строк в файле только в том случае, если они соответствуют шаблонам в другом файле
  • Как выбрать первое совпадение между двумя шаблонами, включая их
  • One Solution collect form web for “Как заменить несколько букв в многострочном слове, состоящем из цифр и букв в определенном формате?”

    Что касается того, что не так с вашим скриптом, вы заменяете A или a на AB и D или d на DK , поэтому любые ранее существовавшие B или K не будут затронуты; sed не ищет его. Вы можете использовать [kK] [bB] или [kK] ? (ноль или один из предыдущего символа), чтобы он заменил этот символ, если это произойдет.

    Чтобы убедиться, что замена происходит только в том случае, если для параметра [aA] или [aA][bB] т. Д. [aA][bB] число, вы можете добавить номер в шаблон и добавить его обратно в замещение () и \1

     sed -r 's/ab?([0-9])/AB\1/Ig;s/dk?([0-9])/DK\1/Ig' filename 

    Я использую -r для использования ERE (так что вам не нужно бежать ? ), И I для поиска без учета регистра вместо использования классов символов.

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