【问题标题】:Find a word and replace with words from file查找一个单词并用文件中的单词替换
【发布时间】:2016-08-19 14:52:04
【问题描述】:

我的任务是创建一个配置文件。配置文件是一个 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次。然后我想用从另一个逗号分隔文件输入的不同样式替换“样式”属性,如下所示。

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;"
        }

有没有更简单的方法?

【问题讨论】:

    标签: shell awk sed vi replacewith


    【解决方案1】:

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

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

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

    我不愿意承认 JSON 最好使用 Perl、Ruby 或 python 的 JSON 解析器进行解析,但将其发布为一次性选项,因为您无法控制配置文件。

    【讨论】:

      【解决方案2】:

      awk 来救援!

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

      其中模板是 json 格式的文本,样式是逗号分隔的文件(一行或多行)。假设“粗体”在模板中只出现一次。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • json 的读取超出了我的控制范围。我只是提供配置文件。所以我一定会在文件中做到这一点
        • 如果你可以只修改 json 文件,那么我认为你无能为力。等着看有没有人知道方法。如果您有权修改文件之外的文件(在代码中),您可以简单地使用 put 方法。 JSONObject 日期= jsonArray.getJSONObject(0).getJSONObject("day"); person.put("day", "Tuesday");
        最近更新 更多