jav*_*ish 1 bash shell automation jq
我是 bash shell 脚本和自动化的新手。我正在尝试创建一个相对简单的脚本,它解析 JSON 文件并从解析的数据中打印一些 PHP。
为了解析 JSON,我想使用 jq。这是我的 bash shell 脚本中执行此操作的代码:
jq . test.json
Run Code Online (Sandbox Code Playgroud)
我的 JSON 中的对象具有有关图像的属性。我将使用 JSON 中的属性是:
num = each image is assigned a number, 1 to infinity
filename = the name of the image file
name = the title of the image
Run Code Online (Sandbox Code Playgroud)
JSON 文件示例:
{
"num": 1,
"filename": "trees-in-nature.jpg",
"name": "Trees In Nature"
}
{
"num": 2,
"filename": "running-dogs.jpg",
"name": "Running Dogs"
}
{
"num": 3,
"filename": "beautiful-lake.jpg",
"name": "Beautiful Lake"
}
Run Code Online (Sandbox Code Playgroud)
我想获取解析后的 JSON 属性并将其输出到一些 PHP 代码。JSON 代码中的每个图像将输出两行 PHP,如下所示(JSON 值显示在星号之间):
if($link == *num*) { $linkURL = "*filename*";}
if($link == *num*) { $altText = "*name*";}
Run Code Online (Sandbox Code Playgroud)
例如,我想要输出的最终结果如下所示:
if($link == 1) { $linkURL = "trees-in-nature.jpg";}
if($link == 1) { $altText = "Trees In Nature";}
if($link == 2) { $linkURL = "running-dogs.jpg";}
if($link == 2) { $altText = "Running Dogs";}
...
Run Code Online (Sandbox Code Playgroud)
我所坚持的部分是使用printf打印上面的 PHP 代码。
一旦我弄清楚这一点并完成 shell 脚本并使其可执行,我想使用此命令将结果打印到 PHP 文件。
./parser.sh > test.php
Run Code Online (Sandbox Code Playgroud)
如何printf打印 PHP 并插入 JSON 中的值?
您可以使用独立jq脚本直接处理 JSON,如下所示:
json2php
#!/usr/bin/env -S jq -sjf\n\n.[] |\n(\n # JSON string literal\n "if($link == "\n\n # Concat with num JSON object member converted to JSON string\n + ( .num | tostring )\n\n # Concat with JSON string literal\n + ") { $linkURL = \\""\n\n # Concat with filename JSON object member filtered %coded to URI\n + ( .filename | @uri )\n\n # Concat with JSON string literal including newline\n + "\\";}\\nif($link == "\n\n # Concat with num JSON object member converted to JSON string\n + ( .num | tostring )\n\n # Concat with JSON string literal\n + ") { $altText = \\""\n\n # Concat with name JSON object member filtered to HTML entities if needed\n + ( .name | @html ) + "\\";}\\n"\n)\nRun Code Online (Sandbox Code Playgroud)\n将文件另存为json2php并使其可执行:
#!/usr/bin/env -S jq -sjf\n\n.[] |\n(\n # JSON string literal\n "if($link == "\n\n # Concat with num JSON object member converted to JSON string\n + ( .num | tostring )\n\n # Concat with JSON string literal\n + ") { $linkURL = \\""\n\n # Concat with filename JSON object member filtered %coded to URI\n + ( .filename | @uri )\n\n # Concat with JSON string literal including newline\n + "\\";}\\nif($link == "\n\n # Concat with num JSON object member converted to JSON string\n + ( .num | tostring )\n\n # Concat with JSON string literal\n + ") { $altText = \\""\n\n # Concat with name JSON object member filtered to HTML entities if needed\n + ( .name | @html ) + "\\";}\\n"\n)\nRun Code Online (Sandbox Code Playgroud)\n将其用作:
\nchmod +x json2php\nRun Code Online (Sandbox Code Playgroud)\n怎么运行的:
\nshebang告诉用参数#!/usr/bin/env -S jq -sjf执行解释器:jq-sjf
jq论点:
-s:将输入作为 JSON 对象流而不是单个 JSON 对象进行处理。-j:产生没有换行符的原始输出。-f:将其加载为脚本(适合 shebang)。现在jq脚本本身:
.[] |:从输入流数组中输送每个对象进行处理( ... ): 团体指示。"if($link == ":只是按原样打印的 JSON 字符串文字(不带双引号,"因为jq已指示使用-j选项开关生成原始输出。+ ( .num | tostring ): 连接起来num:与转换为字符串的成员+ ") { $linkURL = \\"":与另一个 JSON 字符串文字连接。+ ( .filename | @uri )filename:与作为 URI 过滤的成员连接,因此特殊字符如空格+ &,因此特殊字符(例如空格...)将被 % 编码。+ "\\";}\\n":与另一个 JSON 字符串文字连接,包括转义为的换行符\\n作为原始换行符打印例子input.json(注意空格和引号以探测测试过滤器是否按预期工作):
./json2php input.json >test.php\nRun Code Online (Sandbox Code Playgroud)\n从上面的输入生成 php 代码:
\n{\n "num": 1,\n "filename": "trees-in-nature.jpg",\n "name": "Trees In Nature"\n}\n{\n "num": 2,\n "filename": "running dogs.jpg",\n "name": "Running \\"Dogs\\""\n}\n{\n "num": 3,\n "filename": "beautiful-lake.jpg",\n "name": "Beautiful\' Lake"\n}\nRun Code Online (Sandbox Code Playgroud)\n生成 PHP 的替代方案switch语句的替代方法:
if($link == 1) { $linkURL = "trees-in-nature.jpg";}\nif($link == 1) { $altText = "Trees In Nature";}\nif($link == 2) { $linkURL = "running%20dogs.jpg";}\nif($link == 2) { $altText = "Running "Dogs"";}\nif($link == 3) { $linkURL = "beautiful-lake.jpg";}\nif($link == 3) { $altText = "Beautiful' Lake";}\nRun Code Online (Sandbox Code Playgroud)\n结果相同input.json:
#!/usr/bin/env -S jq -srf\n\n# JSON string literal\n"switch ($link) {",\n(\n .[] |\n (\n # JSON string literal\n " case "\n\n # Concat with num JSON object member converted to JSON string\n + ( .num | tostring )\n\n # Concat with JSON string literal\n + ":",\n\n # New JSON string litteral\n " $linkURL = \\""\n\n # Concat with filename JSON object member filtered %coded to URI\n + ( .filename | @uri )\n\n # Concat with JSON string literal\n + "\\";",\n\n # New JSON string litteral\n " $altText = \\""\n\n # Concat with name JSON object member filtered to HTML entities if needed\n + ( .name | @html )\n\n # Concat with JSON string literal\n + "\\";",\n\n # New JSON string litteral\n " break;"\n )\n),\n# JSON string literal\n"}"\nRun Code Online (Sandbox Code Playgroud)\n