如何用每个出现的唯一值替换文件中的所有出现

如何用每个出现的唯一值替换文件中的所有出现

我有一个 xml 文件,其中多次出现 MyID,如下所示。

MyID="dett090900990000"

我想MyID=""用唯一值替换所有出现的值。

例如,如果我在 xml 文件中出现 3 次MyID="",当我运行脚本时,我将传递一个将用作 MyID 值的参数(但增量值将分配给每次出现)。

即当我将我的脚本运行为myscript.sh 7777777878889888

输出应如下所示(这意味着 MyID 的所有值都将更改,现在将具有唯一值)。它可以是任何东西(数字、字符串和混合)。

MyID="77777778788898881" MyID="77777778788898882" MyID="77777778788898883"

如您所见,1、2 和 3 将附加到提供的值中。

我正在寻找简单的命令来解决这个问题!谢谢你!

答案1

在 Perl 中可以这样完成:

perl -pe 'BEGIN { $v=shift; }
          s/(MyID=")[^"]*(")/$1.$v.++$t.$2/ge' 7777777878889888 foo.xml bar.xml

答案2

这并不简单,但很有效。脚本有两个参数,Arg1 是要匹配的字符串,Arg2 是输入文件的文件名。该解决方案使用 awk 而不是 sed。

#!/bin/bash
# myscript.sh
# Usage myscript.sh <string to match> <filename>

MyID=$1

awk -v MyID=$MyID 'BEGIN{ mynum=1; } { if (match($0,MyID) ) { sub(MyID, sprintf("%s%d", MyID, mynum) ) mynum++; } print }' $2

相关内容