找到一个单词并替换为文件中的单词

时间:2016-04-26 01:12:40

标签: shell awk sed vi replacewith

我的任务是创建配置文件。配置文件是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的“样式”属性的更改而重复。所以我要复制上面的文字说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;"
        }

有更简单的方法吗?

3 个答案:

答案 0 :(得分:4)

使用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的文件,该文件具有所需样式的逗号分隔值。您将它们存储在一个数组中。您继续迭代配置文件并换出样式段并将其替换为新模式。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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