Замена строки на увеличивающееся число

#re&ex #awk

#регулярное выражение #awk

Вопрос:

Входной файл

 AAAAAA this is some content.
This is AAAAAA some more content BBBBBB. BBBBBB BBBBBB
This is yet AAAAAA some more BBBBBB BBBBBB BBBBBB content.
  

Я могу частично выполнить это с помощью этого кода:

 awk '/AAAAAA/{&sub("AAAAAA", "x"  i)}1' test.txt &&t; test1.txt
awk '{for(x=1;x<=NF;x  )if($x~/BBBBBB/){sub(/BBBBBB/,"y"  i)}}1' test1.txt 
  

Вывод:

 x1 this is some content.
This is x2 some more content y1. y2 y3
This is yet x3 some more y4 y5 y6 content.
  

В любом случае, чтобы получить этот вывод?

Ожидаемый результат:

 x1 this is some content.
This is x2 some more content y1. y2 y3
This is yet x3 some more y1 y2 y3 content.
  

Ответ №1:

еще одно

 $ awk '{sub("AAAAAA","x"(  x)); y=0; while(sub("BBBBBB","y"(  y)));}1' file

x1 this is some content.
This is x2 some more content y1. y2 y3
This is yet x3 some more y1 y2 y3 content.
  

Ответ №2:

Вы можете использовать этот единственный awk :

 awk '{
   j=0
   for (x=1; x<=NF; x  )
      if ($x ~ /^A{6}/)
         sub(/^A{6}/, "x" (  i), $x)
      else if ($x ~ /^B{6}/)
         sub(/^B{6}/, "y" (  j), $x)
} 1' file
  
 x1 this is some content.
This is x2 some more content y1. y2 y3
This is yet x3 some more y1 y2 y3 content.
  

Ответ №3:

Просто нужно сбросить i=0 после каждого цикла:

 awk '/AAAAAA/{&sub("AAAAAA", "x"  i)}1' test.txt &&t; test1.txt
awk '{for(x=1;x<=NF;x  )if($x~/BBBBBB/){sub(/BBBBBB/,"y"  i)}{i=0}}1' test1.txt 
  

Вывод:

 x1 this is some content.
This is x2 some more content y1. y2 y3
This is yet x3 some more y1 y2 y3 content.
  

Ответ №4:

Вот альтернативный вариант awk , который легко расширяется для добавления любого количества тегов, сколько вы пожелаете:

 awk 'BEGIN{ rep["AAAAAA"]="x"; cnts["AAAAAA"]=1; reset["AAAAAA"]=0
            rep["BBBBBB"]="y"; cnts["BBBBBB"]=1; reset["BBBBBB"]=1
            # and so on...
        }
        {   
            for (e in rep) {
                cnts[e]=(reset[e]) ? reset[e] : cnts[e] 
                while ( sub(e,rep[e] (cnts[e]  ) ) )
                    ; # empty statement since work is inside the while
        }
        } 1' file 
  

С принтами:

 x1 this is some content.
This is x2 some more content y1. y2 y3
This is yet x3 some more y1 y2 y3 content.