Nói chung, bạn nên tránh sử dụng các công cụ phân tích cú pháp văn bản chung cho dữ liệu có cấu trúc. Vì bạn có tệp json nên việc sử dụng trình phân tích cú pháp json chuyên dụng sẽ an toàn và đơn giản hơn. Trong trường hợp của bạn, bạn muốn trích xuất giá trị của phần tử đầu tiên của mảng tranh luận
chính nó là phần tử đầu tiên của mảng cấp cao nhất tranh luận
, con của hàm băm cấp cao nhất $quer
:
$ jq '."$quer",."args"[0]["args"]' file.json
[
"chọn\n db1.table1 làm tab1,\n db1.table2 làm tab2,\n db1.table3 làm tab3\n từ db1.table4 làm tab4"
]
Từ đây, bạn không còn dữ liệu có cấu trúc nữa và bạn cần sử dụng các phương pháp thô sơ hơn. Tôi không biết bạn muốn xác định chuỗi mục tiêu của mình như thế nào, bạn đã không giải thích điều đó. Vì vậy, tùy thuộc vào những gì bạn thực sự muốn, bạn có thể làm:
Bỏ qua các dòng bắt đầu bằng [
hoặc ]
và sau đó in từ thứ hai của các dòng còn lại:
$ jq '."$quer".."args"[0]["args"]' file.json | awk '/^[^][]/{in $2}'
db1.table1
In từ thứ hai của dòng thứ hai
$ jq '."$quer".."args"[0]["args"]' file.json | awk 'NR==2{in $2}'
db1.table1
In đoạn dài nhất không có khoảng trắng sau chuỗi "chọn\n
:
$ jq '."$quer".."args"[0]["args"]' file.json | grep -oP '"chọn\n\s*\K\S*'
db1.table1
Nếu bạn giải thích chính xác cách chúng tôi phải biết chuỗi nào cần trích xuất, tôi có thể cung cấp cho bạn câu trả lời có mục tiêu hơn.
Để hoàn thành, trong của bạn cụ thể và tôi nhấn mạnh rằng điều này sẽ không khả dụng và gần như chắc chắn sẽ thất bại nếu dữ liệu đầu vào của bạn thay đổi theo bất kỳ cách nào, bạn có thể sử dụng trực tiếp các công cụ văn bản đơn giản:
$ grep -oP '"chọn\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