โดยทั่วไป คุณควรหลีกเลี่ยงการใช้เครื่องมือแยกวิเคราะห์ข้อความทั่วไปสำหรับข้อมูลที่มีโครงสร้าง เนื่องจากคุณมีไฟล์ 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"
]
จากตรงนี้ คุณจะไม่มีข้อมูลที่มีโครงสร้างอีกต่อไป และคุณต้องใช้วิธีที่หยาบกว่า ฉันไม่รู้ว่าคุณต้องการระบุสตริงเป้าหมายของคุณอย่างไร คุณไม่ได้อธิบาย ดังนั้น ขึ้นอยู่กับสิ่งที่คุณต้องการจริง ๆ คุณสามารถทำได้:
ข้ามเส้นที่ขึ้นต้นด้วย [
หรือ ]
แล้วพิมพ์คำที่สองของบรรทัดที่เหลือ:
$ jq '."$quer"."args"[0]["args"]' file.json | ไฟล์ awk '/^[^][]/{พิมพ์ $2}'
db1.table1
พิมพ์คำที่สองของบรรทัดที่สอง
$ jq '."$quer"."args"[0]["args"]' file.json | ไฟล์ awk 'NR==2{พิมพ์ $2}'
db1.table1
พิมพ์ช่องว่างที่ไม่ใช่ช่องว่างที่ยาวที่สุดหลังจากสตริง "เลือก\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