我有 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:}