Nếu bạn thực sự không thể sử dụng một cú pháp JSON đúng như jq
[1] , hãy thử một awk
giải pháp dựa trên:
Bash 4.x:
readarray -t values < <(awk -F\" 'NF>=3 {print $4}' myfile.json)
Bash 3 .x:
IFS=$'\n' read -d '' -ra values < <(awk -F\" 'NF>=3 {print $4}' myfile.json)
Cửa hàng này tất cả các thuộc tính giá trị trong mảng Bash ${values[@]}
, bạn có thể kiểm tra với
declare -p values
.
Những giải pháp này có những hạn chế:
- mỗi tài sản phải nằm trên một dòng riêng,
- tất cả các giá trị phải được dụng dấu ngoặc kép,
- nhúng thoát dấu ngoặc kép không được hỗ trợ.
Tất cả những hạn chế này củng cố đề xuất sử dụng trình phân tích cú pháp JSON thích hợp.
Lưu ý: Các giải pháp thay thế sau đây sử dụng Bash 4.x + readarray -t values
lệnh, nhưng họ cũng làm việc với các thay thế Bash 3.x, IFS=$'\n' read -d '' -ra values
.
grep
+ cut
kết hợp: Một grep
lệnh duy nhất sẽ không làm (trừ khi bạn sử dụng GNUgrep
- xem dưới đây), nhưng thêm cut
giúp:
readarray -t values < <(grep '"' myfile.json | cut -d '"' -f4)
GNUgrep
: Sử dụng -P
để hỗ trợ PCRE, công cụ hỗ trợ t \K
để thả tất cả mọi thứ xuất hiện cho đến nay (một lựa chọn linh hoạt hơn để nhìn phía sau khẳng định) cũng như khẳng định nhìn về phía trước ((?=...)
):
readarray -t values < <(grep -Po ':\s*"\K.+(?="\s*,?\s*$)' myfile.json)
Cuối cùng, đây là một Bash tinh khiết (3 .x +) giải pháp:
Điều gì làm cho một thay thế khả thi này về hiệu suất là không tiện ích bên ngoài được gọi là trong mỗi vòng lặp; tuy nhiên, đối với các tệp nhập lớn hơn, một giải pháp dựa trên các tiện ích bên ngoài sẽ nhanh hơn nhiều.
#!/usr/bin/env bash
declare -a values # declare the array
# Read each line and use regex parsing (with Bash's `=~` operator)
# to extract the value.
while read -r line; do
# Extract the value from between the double quotes
# and add it to the array.
[[ $line =~ :[[:blank:]]+\"(.*)\" ]] && values+=("${BASH_REMATCH[1]}")
done < myfile.json
declare -p values # print the array
[1] Đây là những gì một mạnh mẽ jq
giải pháp dựa trên sẽ trông như thế (Bash 4.x):
readarray -t values < <(jq -r '.[]' myfile.json)
Sử dụng 'jq' cho việc này. – sjsam
Hãy xem câu hỏi và hiển thị của [\ [this \]] (http://unix.stackexchange.com/questions/177843/parse-one-field-from-an-json-array-into-bash-array) chúng tôi nỗ lực một phần để giải quyết vấn đề này. – sjsam
This 'cat myfile.json | tên grep | cut -d ':' -f2' có thể hữu ích. –