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 awkvà '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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.