查找单词并替换为文件中的单词
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 选项,因为您无法控制配置文件。
我有创建配置文件的任务。配置文件是一个 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 选项,因为您无法控制配置文件。