用数字序列替换文本

用数字序列替换文本

我有 2250 个元数据文件,需要有一个从 0 开始到 2249 的唯一编号,如下行所示。

"name": "KF # RENUMBER",

我已经使用 perl 命令(perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.json)在多个文件中将一个单词替换为我需要的任何内容,但我无法弄清楚如何将它替换为数字而不是单词,所以最后我有多个文件包含如下一行:

"name": "KF # 1",
"name": "KF # 2",
...
"name": "KF # 2249",

我试过perl -pi -w -e 's/RENUMBER/$count++;/g;' *.json

"name": "KF # ++;",所有文件都返回了

如果这很重要的话,我正在使用 MacOS 中的终端来执行此操作。

任何帮助都将不胜感激!谢谢!

答案1

您需要告诉 Perl,替换部分不是一个字符串而是一些要运行的代码:

perl -pi -w -e 's/RENUMBER/++$count/ge' *.json
#                                    ^

“e” 代表“评估”。

另外,如果您想从 1 而不是 0 开始,请切换到++$count

您还可以在替换之外增加变量。

perl -i~ -pwe '++$count; s/RENUMBER/$count/' *.json

如果每行有多个 RENUMBER,则其行为会有所不同(前一个 RENUMBER 用不同的数字替换每个 RENUMBER,而这个 RENUMBER 对整行使用相同的数字)。我假设每行 RENUMBER 不会超过一个,因此我删除了/g

答案2

您需要将e标志添加到s//表达式中,这会告诉 perl 将替换部分作为表达式进行评估:

perl -pi -w -e 's/RENUMBER/$count++;/ge;' *.json

给定三个文件,data{1,2,3}.json每个文件包含:

{
"name": "KF # RENUMBER",
}

运行上述命令的结果是:

$ grep -n . *json
data1.json:1:{
data1.json:2:"name": "KF # 0",
data1.json:3:}
data2.json:1:{
data2.json:2:"name": "KF # 1",
data2.json:3:}
data3.json:1:{
data3.json:2:"name": "KF # 2",
data3.json:3:}

相关内容