如何让 bash shell 脚本使用 jq 解析 JSON 文件,然后将结果打印到 PHP 文件?

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 中的值?

Léa*_*ris 5

您可以使用独立jq脚本直接处理 JSON,如下所示:

\n

json2php

\n
#!/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)\n
Run Code Online (Sandbox Code Playgroud)\n

将文件另存为json2php并使其可执行:

\n
#!/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)\n
Run Code Online (Sandbox Code Playgroud)\n

将其用作:

\n
chmod +x json2php\n
Run Code Online (Sandbox Code Playgroud)\n

怎么运行的:

\n

shebang告诉用参数#!/usr/bin/env -S jq -sjf执行解释器:jq-sjf

\n

jq论点:

\n
    \n
  • -s:将输入作为 JSON 对象流而不是单个 JSON 对象进行处理。
  • \n
  • -j:产生没有换行符的原始输出。
  • \n
  • -f:将其加载为脚本(适合 shebang)。
  • \n
\n

现在jq脚本本身:

\n
    \n
  • .[] |:从输入流数组中输送每个对象进行处理
  • \n
  • ( ... ): 团体指示。
  • \n
  • "if($link == ":只是按原样打印的 JSON 字符串文字(不带双引号,"因为jq已指示使用-j选项开关生成原始输出。
  • \n
  • + ( .num | tostring ): 连接起来num:与转换为字符串的成员
  • \n
  • + ") { $linkURL = \\"":与另一个 JSON 字符串文字连接。
  • \n
  • + ( .filename | @uri )filename:与作为 URI 过滤的成员连接,因此特殊字符如空格+ &,因此特殊字符(例如空格...)将被 % 编码。
  • \n
  • + "\\";}\\n":与另一个 JSON 字符串文字连接,包括转义为的换行符\\n作为原始换行符打印
  • \n
  • \xe2\x80\xa6
  • \n
\n

例子input.json(注意空格和引号以探测测试过滤器是否按预期工作):

\n
./json2php input.json >test.php\n
Run 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}\n
Run Code Online (Sandbox Code Playgroud)\n

生成 PHP 的替代方案switch语句的替代方法:

\n
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";}\n
Run Code Online (Sandbox Code Playgroud)\n

结果相同input.json

\n
#!/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"}"\n
Run Code Online (Sandbox Code Playgroud)\n