如何用BASH中的递增数替换所有匹配?

时间:2014-05-10 05:38:59

标签: bash sed

我有一个这样的文本文件:

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.

如何用递增的数字替换所有匹配?

5 个答案:

答案 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/