我有一个这样的文本文件:
AAAAAA this is some content.
This is AAAAAA some more content AAAAAA. AAAAAA
This is yet AAAAAA some more [AAAAAA] content.
我需要用递增的数字替换所有出现的AAAAAA
,例如,输出看起来像这样:
1 this is some content.
This is 2 some more content 3. 4
This is yet 5 some more [6] content.
如何用递增的数字替换所有匹配?
答案 0 :(得分:12)
这是一种方法:
$ awk '{for(x=1;x<=NF;x++)if($x~/AAAAAA/){sub(/AAAAAA/,++i)}}1' file
1 this is some content.
This is 2 some more content 3. 4
This is yet 5 some more [6] content.
答案 1 :(得分:3)
这可能适合你(GNU sed):
sed -r ':a;/AAAAAA/{x;:b;s/9(_*)$/_\1/;tb;s/^(_*)$/0\1/;s/$/:0123456789/;s/([^_])(_*):.*\1(.).*/\3\2/;s/_/0/g;x;G;s/AAAAAA(.*)\n(.*)/\2\1/;ta}' file
这是一个玩具示例,perl或awk更适合解决方案。
解决方案仅作用于包含所需字符串(AAAAAA
)的行。
保持缓冲区用作保持递增整数的位置。
概述:当遇到所需的字符串时,保留空间中的整数会递增,附加到当前行,交换所需的字符串,然后重复该过程,直到所有出现的字符串都被计算在内。< / p>
递增一个整数只是简单地换掉序列中下一个整数的最后一个数字(除了尾随9&#39; s)0到1,1到2 ... 8到9.其中9到9的结尾每个尾随9由非整数字符代替,例如&#39; _&#39;。如果递增的数字完全由尾随9组成,则0
被添加到数字的前面,以便它可以递增到1
。在增量操作之后,尾随的9(现在_
&#39; s)被&#39; 0替换。
例如,假设整数9递增:
9
被_
取代,0
被添加(0_
),0
被换成1(1_
) ,_
被0
取代。结果是10
。
请参阅针对@jaypal的评论以获取进一步的说明。
答案 2 :(得分:1)
perl解决方案:
perl -pe 'BEGIN{$A=1;} s/AAAAAA/$A++/ge' test.dat
答案 3 :(得分:0)
也许是这样的
#!/bin/bash
NR=1
cat filename while read line
do
line=$(echo $line | sed 's/AAAAA/$NR/')
echo ${line}
NR=$((NR + 1 ))
done
答案 4 :(得分:0)
Perl为我完成了工作
perl -pi -e 's/\b'DROP'\b/$&.'_'.++$A /ge' /folder/subfolder/subsubfolder/*
输入:
DROP
drop
$drop
$DROP
$DROP="DROP"
$DROP='DROP'
$DROP=$DROP
$DROP="DROP";
$DROP='DROP';
$DROP=$DROP;
$var="DROP_ACTION"
drops
DROPS
CODROP
'DROP'
"DROP"
/DROP/
输出:
DROP_1
drop
$drop
$DROP_2
$DROP_3="DROP_4"
$DROP_5='DROP_6'
$DROP_7=$DROP_8
$DROP_9="DROP_10";
$DROP_11='DROP_12';
$DROP_13=$DROP_14;
$var="DROP_ACTION"
drops
DROPS
CODROP
'DROP_15'
"DROP_16"
/DROP_17/