查找单词并替换为文件中的单词

Find a word and replace with words from file

我有创建配置文件的任务。配置文件是一个 JSON 文件。下面的例子

"text": {
        "data": "Click Here",
        "size": 36,
        "style": "bold",
        "name": "text1",
        "hOffset": 250,
        "vOffset": 100,
        "alignment": "center",
        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
    }

配置重复 json 的“style”属性。所以我要将上面的文字复制 50 遍。然后我想用从另一个逗号分隔文件输入的不同样式替换 "style" 属性,如下所示。

bold,italic,cryptic

输出将是

"text": {
            "data": "Click Here",
            "size": 36,
            "style": "bold",
            "name": "text1",
            "hOffset": 250,
            "vOffset": 100,
            "alignment": "center",
            "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
        }
"text": {
            "data": "Click Here",
            "size": 36,
            "style": "italic",
            "name": "text1",
            "hOffset": 250,
            "vOffset": 100,
            "alignment": "center",
            "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
        }
"text": {
            "data": "Click Here",
            "size": 36,
            "style": "cryptic",
            "name": "text1",
            "hOffset": 250,
            "vOffset": 100,
            "alignment": "center",
            "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
        }

有更简单的方法吗?

我不确定您要应用它的目的是什么,但您可以阅读 json 每次迭代都相同的内容,并在该迭代中根据需要更改 Style 的值。只是一个想法。

awk 救援!

$ awk -v RS= 'NR==FNR{t=[=10=];next} 
                     {n=split([=10=],styles,","); 
                      for(i=1;i<=n;i++) {s=t; 
                                         sub("bold",styles[i],s); 
                                         print s
                                        }
                     }' template styles

其中模板是 json 格式化文本,样式是逗号分隔文件(一行或多行)。假设 "bold" 在模板中只出现一次。

另一个使用 GNU awk 的解决方案 gensub:

awk -v RS= '
  NR==FNR { n = split([=10=], styles, /,/); next } 
  {
    for (i=1; i<=n; i++) {
      style = "\"" styles[i] "\""
      print gensub (/(["]style["]: ).[^,]+/, "\1" style, "G", [=10=]); 
    }
  }
' style.txt config.file

您从一个名为 style.txt 的文件开始,该文件包含所需样式的逗号分隔值。您将它们存储在一个数组中。您继续迭代您的配置文件并换出样式段并将其替换为新模式。

我不想承认 JSON 使用 Perl、Ruby 或 python 的 JSON 解析器可以更好地解析,但将其发布为一个- off 选项,因为您无法控制配置文件。