#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.