Điểm:1

Trong dòng văn bản tùy ý, làm cách nào để bash có thể trích xuất một giá trị được đặt tên sau dấu bằng?

lá cờ ao

Câu hỏi này (Cách lấy giá trị sau dấu bằng) về cơ bản là những gì tôi muốn:

Đưa ra một dòng văn bản, với cú pháp tìm kiếm tham số được đặt tên như màu = đỏ, sử dụng bash làm cách nào bạn có thể lấy giá trị màu đó (mang lại màu đỏ)?

Ngoại trừ trong câu hỏi đó, dòng văn bản hoàn toàn là các cặp khóa-giá trị đó, vì vậy câu trả lời được chấp nhận sử dụng bash's đánh giá vì cú pháp đó xảy ra rất phù hợp.


Tôi đang tự hỏi một dòng văn bản chung chung như â â³ Synaptics TM3289-021 id=13 ] làm cách nào tôi có thể lấy giá trị id đó (mang lại 13)?

Có thể sử dụng regex, nơi tôi biết dòng sẽ chứa [khoảng trắng]id=<VĂN BẢN TÔI MUỐN>[khoảng trắng]?

bac0n avatar
lá cờ cn
`xinput list --id-only "Logitech USB Receiver Mouse"` bạn có thể lấy id trực tiếp từ xinput.
Điểm:2
lá cờ it

Sử dụng tiếng kêu'S -o (chỉ xuất văn bản phù hợp).Đọc người đàn ông và làm:

echo "chùm. văn bản id=13 more=4" | \
  grep -E -o 'id=[0-9]+`

Nếu bạn muốn cẩn thận hơn, hãy khớp cả khoảng trắng ở đầu và cuối:

echo "chùm. văn bản id=13 more=4" | \
  grep -E -o ' id=[0-9]+ '
tscizzle avatar
lá cờ ao
Thật tuyệt vời! Sau đó, tôi đoán thật dễ dàng để lấy chuỗi kết quả bắt đầu sau ký tự đầu tiên (vì "id=" là 3 ký tự). Và tôi cũng sẽ tìm cách tìm bất kỳ khoảng trắng nào xung quanh nó, không chỉ khoảng trắng (tôi nghĩ trường hợp của tôi có các tab).
bac0n avatar
lá cờ cn
@tscizzle nếu bạn muốn tất cả các số từ, ví dụ: id= bạn có thể sử dụng giao diện: `grep -Po '(?
terdon avatar
lá cờ cn
@tscizzle bạn cũng có thể sử dụng Biểu thức chính quy tương thích với Perl có `\K` để "bỏ qua mọi thứ đã khớp cho đến thời điểm này" cho phép bạn thực hiện: `grep -oP 'id=\K[0-9]+`.
Điểm:1
lá cờ hr

Nếu bạn thực sự muốn đánh đập để trích xuất giá trị, bạn có thể sử dụng biểu thức chính quy với =~ nhà điều hành bên trong [[ ... ]] dấu ngoặc kiểm tra, ví dụ:

$ re='\bid=([^[:blank:]]*)'
$ line='â â³ Synaptics TM3289-021 id=13 ]'
$ 
$ [[ $line =~ $re ]] && printf '%d\n' "${BASH_REMATCH[1]}"
13

Lưu ý rằng tôi đã sử dụng \ b (một ranh giới từ) thay vì khoảng trắng như neo bắt đầu - điều đó cho phép biểu thức khớp trong trường hợp id=13 xảy ra ở đầu dòng cũng như một phần.

Nếu bạn muốn sử dụng grep, thì tôi khuyên bạn nên sử dụng chế độ tương thích perl của GNU grep để bạn có thể khớp nhưng không bao gồm id= phần:

$ printf '%s\n' "$line" | grep -Po '(?<=id=)\w*'
13

hoặc

$ printf '%s\n' "$line" | grep -Po 'id=\K\w*'
13

Đây, \w* khớp với một chuỗi ký tự từ (có thể trống) - nếu bạn chỉ muốn khớp các ID số, ​​bạn có thể thay đổi \w đến \d.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.