簡體   English   中英

如何僅使用 shell 中的 sed/awk 等基本命令提取 json 對象?

[英]How to extract a json object only using basic commands like sed/awk in shell?

像這樣:我有一個格式如下的 json 文件:

{
    "Item": {
        "summary": {
            "B": "ABCDE"
        },
        "name": {
            "S": "sider"
        },
        "age": {
            "N": "1"
        },
        "data": {
            "B": "abcde"
        }
    }
}

如何僅使用 sed/awk 等現有命令而不在 shell 中安裝任何外部工具來獲取對象“Item”?

預期輸出:

{
    "summary": {
        "B": "ABCDE"
    },
    "name": {
        "S": "sider"
    },
    "age": {
        "N": "1"
    },
    "data": {
        "B": "abcde"
    }
}

正如 chepner 所建議的那樣,您需要質疑您的約束條件。 在某些情況下,你被打得不好,必須處理它。 所以這是一個 sed 方法:

這是 awk 的修訂解決方案。 Sed 也被拋出以取消縮進:

awk '  
  /^    }/  { p = 0 ; print  }  
  p == 1 { print } 
  /"Item": {/ { print "   {" ; p = 1 }  
'  | sed 's/^   //'

最初發布此內容(但注意到輸出與您的期望不符):

sed -n '/^    "Item": {/,/^    }/p'

上面的 sed 方法假設 Item 是縮進的,就像你在上面的示例輸入中一樣。

這是使用我最喜歡的 jq 的方法:

jq '.Item'

您最好檢查一下您的機器上是否安裝了帶有 json 包的 python。 這是一個適合您需求的python3腳本:

#!/usr/bin/env python3

import json
import sys
j = json.load( sys.stdin ) 
print(json.dumps(j["Item"]))

按照慣例,使用諸如sed / awk類的行感知工具來操作諸如JSON類的嵌套數據格式是不正確的。 但是,如果您的選擇有限,那么最好的方法如下:

  1. 將多行文件轉換為單行
  2. 使用awk / sed提取您的Item

這是一個基於sed的解決方案:

bash $ <file.json tr '\n' ' ' | sed -E 's/^ *{ *"Item": +//; s/ *}$//'

這是你需要的:

sed -n '/^    "Item": {/,/^    }/{s/"Item": //;s/^    //;p}'

基本上建立在Mark的解決方案通過使兩個換人刪除"Item":之前去縮進4個空格和p打印。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM