Score:-1

วิธีแยกสตริงออกจากไฟล์ json และใส่ลงในตัวแปร (Linux)

ธง us

ฉันมีสิ่งต่อไปนี้ในไฟล์ json ของฉัน file1.json :-

{
  "$quer": {
    "หาเรื่อง": [{
      "หาเรื่อง": [
        "เลือก\n db1.table1 เป็น tab1,\n db1.table2 เป็น tab2,\n db1.table3 เป็น tab3\n จาก db1.table4 เป็น tab4"
      ],
      "fn": "จาก sql",
      "ns": "ออป"
    }],
    "fn": "ตัวดำเนินการ",
    "ns": "ออป"
  }
}

ฉันต้องการแยกสตริง db1.table4 จากไฟล์ json นี้และเก็บไว้ในตัวแปร

ฉันไม่รู้อะไรมากเกี่ยวกับ sed และ awk ใครสามารถช่วยที่นี่?

terdon avatar
cn flag
เราจะรู้ได้อย่างไรว่าต้องสกัดอะไร? ควรเป็นคำที่สองจากองค์ประกอบแรกในอาร์เรย์ `args` หรือไม่ มันควรเป็นอะไรก็ตามที่อยู่หลัง `select\n` หรือไม่ เราจะระบุส่วนของไฟล์ที่คุณต้องการแยกได้อย่างไร
Score:2
ธง us
  1. สมมติว่าสตริงที่คุณต้องการแยกอยู่ในตำแหน่งเดียวกันในทุกไฟล์ที่คุณสามารถใช้ได้ ศีรษะ, หาง และ ตัด คำสั่งโดยใช้ไพพ์

  2. ตัวอย่างเช่น:

    $ หัว -6 file.json | หาง -1 | ตัด -b 121-129
    db1.table
    
  3. และนี่คือตัวอย่างสคริปต์ที่ตั้งค่าเอาต์พุตเป็นตัวแปร:

    #!/bin/bash
    v1=$(หัว -6 file.json | หาง -1 | ตัด -b 121-130)
    เสียงสะท้อน "$v1"
    

ผลลัพธ์ของสคริปต์จะเป็น db1.table4 ซึ่งเป็นค่าของ V1 ตัวแปร

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับคำสั่งเหล่านี้ได้ที่นี่:

แน่นอน คุณสามารถใช้คำสั่งเหล่านั้นเพื่อแยกสตริงอื่นๆ ออกจากไฟล์ได้

Aviator avatar
us flag
ขอบคุณมาก. มันช่วยฉัน
Score:2
ธง ru

ลองดูสิ ที่ เจคิว โปรเซสเซอร์ JSON บรรทัดคำสั่ง ติดตั้งเช่น:

sudo apt ติดตั้ง jq

สตริงที่คุณต้องการไม่ใช่ค่า JSON แต่เป็นส่วนหนึ่งของค่า JSON ดังนั้นฉันขอแนะนำให้คุณใช้ เจคิว ในการรับสตริง คุณต้องจัดการกับตัวแปร ตัวอย่างเช่น:

my_var=$(jq -r .[$quer].args[0].args[0] file1.json)

สิ่งนี้ทำให้คุณได้รับตัวแปรที่มีคำสั่ง SELECT:

เลือก db1.table1 เป็น tab1, db1.table2 เป็น tab2, db1.table3 เป็น tab3 จาก db1.table4 เป็น tab4

จากนั้นคุณจะต้องใช้เครื่องมืออื่น ๆ เช่น sed, awk, cut ฯลฯ เพื่อรับสตริงย่อยที่คุณต้องการจากตัวแปรนั้น สำหรับกรณีเฉพาะของคุณ สิ่งนี้จะใช้ได้ แต่แน่นอนว่าอาจใช้ไม่ได้กับคำสั่ง SELECT อื่น การตัดด้วยตัวคั่นช่องว่างและส่งกลับค่าที่ 12:

my_table=$(echo $my_var | ตัด -d' ' -f12)
Aviator avatar
us flag
its already there but my question is not json related its to use the unix command.
terdon avatar
cn flag
@Aviator `jq` _is_ a command, just like any other. It is just the right tool to use when parsing json files.
codlord avatar
ru flag
Examples added above.
terdon avatar
cn flag
Thanks! That's much clearer :)
Score:1
ธง cn

โดยทั่วไป คุณควรหลีกเลี่ยงการใช้เครื่องมือแยกวิเคราะห์ข้อความทั่วไปสำหรับข้อมูลที่มีโครงสร้าง เนื่องจากคุณมีไฟล์ json การใช้โปรแกรมแยกวิเคราะห์ json เฉพาะจึงปลอดภัยและง่ายกว่า ในกรณีของคุณ คุณต้องการแยกค่าขององค์ประกอบแรกของอาร์เรย์ หาเรื่อง ซึ่งเป็นองค์ประกอบแรกของอาร์เรย์ระดับบนสุด หาเรื่องลูกของแฮชระดับบนสุด $quer:

$ jq '."$quer"."args"[0]["args"]' file.json
[
  "เลือก\n db1.table1 เป็น tab1,\n db1.table2 เป็น tab2,\n db1.table3 เป็น tab3\n จาก db1.table4 เป็น tab4"
]

จากตรงนี้ คุณจะไม่มีข้อมูลที่มีโครงสร้างอีกต่อไป และคุณต้องใช้วิธีที่หยาบกว่า ฉันไม่รู้ว่าคุณต้องการระบุสตริงเป้าหมายของคุณอย่างไร คุณไม่ได้อธิบาย ดังนั้น ขึ้นอยู่กับสิ่งที่คุณต้องการจริง ๆ คุณสามารถทำได้:

  1. ข้ามเส้นที่ขึ้นต้นด้วย [ หรือ ] แล้วพิมพ์คำที่สองของบรรทัดที่เหลือ:

    $ jq '."$quer"."args"[0]["args"]' file.json | ไฟล์ awk '/^[^][]/{พิมพ์ $2}'
    db1.table1
    
  2. พิมพ์คำที่สองของบรรทัดที่สอง

    $ jq '."$quer"."args"[0]["args"]' file.json | ไฟล์ awk 'NR==2{พิมพ์ $2}'
    db1.table1
    
  3. พิมพ์ช่องว่างที่ไม่ใช่ช่องว่างที่ยาวที่สุดหลังจากสตริง "เลือก\n:

    $ jq '."$quer"."args"[0]["args"]' file.json | ไฟล์ grep -oP '"เลือก\n\s*\K\S*'
    db1.table1
    

หากคุณอธิบายอย่างชัดเจนว่าเราควรจะรู้ได้อย่างไรว่าจะแยกสตริงใด ฉันสามารถให้คำตอบที่ตรงเป้าหมายมากขึ้นได้


เพื่อความสมบูรณ์ในของคุณ เฉพาะเจาะจง ตัวอย่างเช่น และฉันขอเน้นย้ำว่าสิ่งนี้จะไม่สามารถพกพาได้ และเกือบจะล้มเหลวอย่างแน่นอนหากข้อมูลอินพุตของคุณเปลี่ยนแปลงไม่ว่าด้วยวิธีใด คุณสามารถใช้เครื่องมือข้อความอย่างง่ายได้โดยตรง:

$ grep -oP '"select\n\s*\K\S*' file.json 
db1.table1

$awk '$1=="\"select\n"{print $2}' file.json 
db1.table1

$ sed -nE 's/.*"select\n\s*(\S+).*/\1/p' file.json 
db1.table1
hr flag
คุณสามารถทำ awk-like slicing'n'dicing ใน jq ได้ เช่น `jq -r '."$quer".args[0].args[] | แยก ("\n")[-1] | split(" ")[-3]' file.json` หรือบางทีอาจใช้ regex เช่น `jq -r '."$quer".args[0].args[] | จับ ("จาก (?[^ ]+)") | .a'`
terdon avatar
cn flag
@steeldriver ใช่ แต่ฉันคิดว่าเนื่องจากฉันไม่รู้ว่า OP ต้องการแยกอะไรจริง ๆ ฉันอาจให้ตัวเลือกง่าย ๆ เช่นกัน
hr flag
แท้จริงแล้ว...ไม่ชัดเจน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา