Sử dụng biểu thức tương thích perl với GNU grep -P


10

Tôi đang sử dụng regex này (?<=\[')[^,]*trên một tệp chứa dòng saudisk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

Tôi muốn điều đó trở lại OVS/sdasd/asdasd/asdasd/something.img

Làm thế nào để tôi sử dụng grepđể làm cho nó hoạt động?

Tôi đã thử grep -P "(?<=\[')[^,]*"nhưng nó trả về toàn bộ dòng.

Câu trả lời:


14

Thêm công -otắc để grepchỉ trả về những gì phù hợp với mẫu bạn đang chuẩn bị:

$ grep -Po "(?<=\[')[^,]*" data.txt 
OVS/sdasd/asdasd/asdasd/something.img

6

Bạn cũng có thể sử dụng sedmà không cần xác nhận tìm kiếm để có tính di động cao hơn ( -ocó thể không có sẵn cho bạn grep):

sed "s!['\(\[^,\]*\),.*\$!\1!;t;d;p" data.txt

Lưu ý việc sử dụng dấu gạch chéo ngược "lạ" ở đây. Đó là do thực tế sedsử dụng BREs theo mặc định (xem câu hỏi này ).

Nói về tính di động, tại sao không sử dụng Perl?

perl -nle "print \$1 if /\['([^,]*)/" data.txt

2

@slm đã cho bạn câu trả lời kinh điển. Dưới đây là một vài lựa chọn khác:

Sử dụng awk'làm dấu phân cách trường (giả sử tất cả các dòng có cùng định dạng):

$ awk -F "'" '($1~/ = /){print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w    

Làm toàn bộ trong perl:

$ perl -lne 'print $1 if /\[.(.*?).\]/' data.txt 
OVS/sdasd/asdasd/asdasd/something.img, w    

Sử dụng regex đơn giản hơn và phân tích kết quả:

$ grep "\[.*\]" data.txt | awk -F "'" '{print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep -o "\[.*\]" data.txt | perl -pe "s/[\[\]']//g"
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | sed 's/.*\[.\(.*\).\]/\1/'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | perl -pne 's/.*\[.(.*?).\].*/$1/'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | perl -lne 'print $1 if /\[.(.*?).\]/'
OVS/sdasd/asdasd/asdasd/something.img, w
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.