我想使用 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"