Có một số câu trả lời hay ở đây, nhưng tôi chỉ thấy một câu kết hợp Val
một phần của vấn đề và không rõ liệu điều đó có đúng hay không. Tôi đồng ý rằng đó awk
là một công cụ tuyệt vời, nhưng nó không cần thiết ở đây; Tôi tin rằng sed
lệnh này :
sed -n '/\[part1\]/,/\[part2\]/s/.*Val.*=//p' "$file"
có lẽ làm những gì mong muốn. Giống như các sed -e '/\[part1\]/,/\[part2\]/p'
giải pháp khác ( Networker
và Babyy ), đây là khả năng thích ứng tầm thường để chọn bất kỳ phần nào. (Bạn làm gì, tất nhiên, cần phải biết tên của nó, nếu bạn chỉ biết số thứ tự của nó, bạn có thể thích nghi với câu trả lời terdon của
hoặc câu trả lời glenn jackman của , cả hai đều đếm phần chứ không phải là tìm kiếm một tên cụ thể.) Nếu bạn không biết tên của phần sau, bạn có thể làm
sed -n '/ \ [part42 \] /, / \ [part / s' '$ file "
ví dụ.
Câu hỏi meta duy nhất của tôi liên quan đến cut -d'=' -f2
một phần của câu hỏi. Nếu một dòng đầu vào mà chúng tôi trích xuất dữ liệu chứa nhiều =
ký tự sau Val
(nghĩa là giá trị trường chứa =
ký tự), vd
Einstein.Val = E=mc^2
sau đó cut
lệnh trên sẽ chỉ trích xuất văn bản giữa =
giá trị thứ nhất và thứ hai (nghĩa là giá trị trường, tối đa (nhưng không bao gồm) đầu tiên =
), ví dụ : E
. Các sed
lệnh tôi đã trình bày ở trên sẽ trích xuất chỉ các văn bản sau khi cuối cùng =
(ví dụ mc^2
). Để có được mọi thứ sau lần đầu tiên =
(ví dụ E=mc^2
:), hãy sử dụng
sed -n '/\[part1\]/,/\[part2\]/s/.*Val[^=]*=//p' "$file"
Để bắt chước hành vi của cut
(ví dụ E
:), hãy sử dụng
sed -n '/\[part1\]/,/\[part2\]/s/.*Val[^=]*=\([^=]*\).*/\1/p' "$file"
Lưu ý rằng phương pháp của tôi giả định rằng dữ liệu nhìn ít nhất giống như minh họa trong câu hỏi; tức là, ít nhất một cái =
xuất hiện ở đâu đó bên phải Val
chuỗi. Theo đó, tất cả các giải pháp của tôi sẽ bỏ qua đầu vào như
Girl.Name = Valerie
Valerie Bertinelli
ngay cả khi nó rơi vào giữa [part1]
và [part2]
.
cat file | grep foo
là vô nghĩa. Nó được gọi là "sử dụng mèo vô dụng" . Bạn luôn có thể làmgrep foo file
thay thế.