2016-04-26 2 views
3

У меня есть задача создать файл конфигурации. Файл конфигурации является файлом 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;" 
     } 

Есть ли простой способ сделать это?

ответ

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, который значений, разделенных запятыми стилей, которые вы хотите. Вы храните их в массиве. Вы переходите к итерации своего конфигурационного файла и заменяете сегмент стиля и заменяете его новым шаблоном.

Ненавижу признать, что JSON лучше разбираются с парсером JSON, используя Perl, Ruby или python, но публикуя это как одноразовый вариант, так как у вас нет никакого контроля над конфигурационным файлом.

0

Я не уверен в том, что вы хотите применить, но вы можете прочитать json одинаково для каждой итерации и в рамках этой итерации изменить значение стиля, в котором вам нужно. Просто идея.

+0

Чтение json не подлежит контролю. Я просто предоставляю файл конфигурации. Поэтому я обязан сделать это в файле –

+0

Если вы можете просто изменить json-файл, я не думаю, что вы можете многое сделать. Подождите, чтобы узнать, знает ли кто-нибудь другой способ. Если у вас есть доступ к изменению файла за пределами файла (в коде), вы можете просто использовать меток put. JSONObject date = jsonArray.getJSONObject (0) .getJSONObject («день»); person.put («день», «вторник»); –

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 

где шаблон - форматированный json текст и стили - файл с разделителями-запятыми (одна или несколько строк). Предполагается, что «жирный шрифт» появляется только один раз в шаблоне.

Смежные вопросы