如何使用 sed 解析 JSON 后删除空格

如何使用 sed 解析 JSON 后删除空格

从 JSON 解析后,如何删除任何空格(如果有)?

whereami -r不使用 sed 来解析结果。

{
  "ip": "95.16.15.10",
  "country_code": "US",
  "country_name": "United States",
  "region_code": "NY",
  "region_name": "New York",
  "city": "The Bronx",
  "zip_code": "10473",
  "time_zone": "America/New_York",
  "latitude": 40.822,
  "longitude": -73.86,
  "metro_code": 501
}

可以工作但需要空间。

whereami -r | sed -rn 's/(^.*city": ")(.*)(".*$)/\2/p'

The Bronx

使用以下方法对 JSON 结果进行排序sed -rn 's/(^.*city": ")(.*)(".*$)/\2/;s/ //p'

"ip": "95.16.15.10",
 "country_code": "US",
 "country_name": "United States",
 "region_code": "NY",
 "region_name": "New York",
TheBronx
 "zip_code": "10473",
 "time_zone": "America/New_York",
 "latitude": 40.822,
 "longitude": -73.86,
 "metro_code": 501

我想要实现的目标

TheBronx 

答案1

awk 对此没有问题

awk  '
    $1 == "\"city\":" {
      $1 = ""
      gsub(/ /,"")
      sub(/^"/,"")
      sub(/",$/,"")
      print
    }
'

我确信 sed 也能处理这个问题,但我从未管理过它的逻辑。但可以在网上看看,例如“sed oneliners”。

实践才能检验真相:

$ awk  '
>     $1 == "\"city\":" {
>       $1 = ""
>       gsub(/ /,"")
>       sub(/^"/,"")
>       sub(/",$/,"")
>       print
>     }
> '
{
  "ip": "95.16.15.10",
  "country_code": "US",
  "country_name": "United States",
  "region_code": "NY",
  "region_name": "New York",
  "city": "The Bronx",
  "zip_code": "10473",
  "time_zone": "America/New_York",
  "latitude": 40.822,
  "longitude": -73.86,
  "metro_code": 501
}
TheBronx

答案2

您可以修改 sed 模式来替换空格。sed 允许链接模式。

's/(^.*city": ")(.*)(".*$)/\2/;s/ //p'

答案3

使用 sed 将适当列表形式的所有值提取到文件中。

sed 's/["{}\]//g' <your_file.json> | sed 's/,/\n/g' >> <your_new_file_to_save>
  • sed's/regexp/replacement/g'输入文件名>输出文件名。
  • 在某些版本的 sed 中,表达式前面必须加上 -e 来表明后面跟着一个表达式。
  • s 代表替代,而 g 代表全局,这意味着行中所有匹配的内容都将被替换。我已将 [ ] 放入其中作为要从 .json 文件中删除的元素。
  • 管道字符 | 用于将一个命令的输出连接到另一个命令的输入。最后我替换“,”并添加称为换行符的“\n”。

如果您想显示单个值,请参阅以下命令:

sed 's/["{}\]//g' <your_file.json> | sed 's/,/\n/g' | sed 's/<ur_value>//p'

例如你想提取 ip 的值

sed 's/["{}\]//g' file.json | sed 's/,/\n/g' | sed 's/ip : //p'

结果:-95.16.15.10

  • 运行 p;这相当于上面的 /pattern match/! p,即“如果该行与 /pattern match/ 不匹配,则打印它”。因此,完整命令会打印从模式的第一次出现到最后一行的所有行,但会抑制匹配的行。

相关内容