sed 命令在多次出现的字符串处附加不同的文本

sed 命令在多次出现的字符串处附加不同的文本

我想使用 sed 命令在多次出现的字符串处附加文本。

例如:

Hello world
types="program"
Mario
types="Game"
Hello world
types="program"
Mario
types="Game"

因此,在第一次出现马里奥时,我想附加“firstMario”,在下次出现时附加“secondMario”,依此类推。输出:

Hello world
types="program"
firstMario
types="Game"
Hello world
types="program"
secondMario
types="Game"

答案1

sed '
  /Mario/{
    s//first&/
    :1
      n
      s//second&/
    b1
  }'

或者:

sed '
  1 {
    x;s/^/first/;x
  }
  /Mario/ {
    G
    s/\(Mario.*\)\n\(.*\)/\2\1/
    x;s/second/third/;s/first/second/;x
  }'

尽管为了每行允许多个马里奥并推广到更多替换,我会使用perl

perl -pe 'BEGIN{@words=qw(first second third)}
          s/(?=Mario)/$words[$n++]/ge'

答案2

您将很难以自动化的方式使用“第一第二第三......”,因为它们在任何地方都没有描述(至少没有标准工具)。我将给出一个整数的解决方案:

n=$( grep -c '^Mario$' file )
for (( i=1 ; i<=$n ; i++ )) ; do
  sed -i "1,/^Mario$/s/^Mario$/$i&/" file
done

输出:

Hello world
types="program"
1Mario
types="Game"
Hello world
types="program"
2Mario
types="Game"

相关内容