Menggunakan perl regex yang kompatibel dengan GNU grep -P

10

Saya menggunakan regex ini (?<=\[')[^,]*pada file yang berisi baris berikutdisk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

Saya ingin itu kembali OVS/sdasd/asdasd/asdasd/something.img

Bagaimana saya menggunakannya grepuntuk membuatnya berfungsi?

Saya sudah mencoba grep -P "(?<=\[')[^,]*"tetapi mengembalikan seluruh baris.

GxFlint
sumber

Jawaban:

14

Tambahkan -osakelar sehingga grephanya mengembalikan yang cocok dengan pola yang Anda inginkan:

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

Anda juga dapat menggunakan sedtanpa pernyataan lookaround untuk portabilitas yang lebih besar ( -omungkin tidak tersedia untuk Anda grep):

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

Perhatikan penggunaan "backslash" yang aneh "lolos di sini. Ini karena fakta bahwa sedmenggunakan BRE secara default (lihat pertanyaan ini ).

Bicara soal portabilitas, mengapa tidak menggunakan Perl saja?

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

@slm sudah memberi Anda jawaban kanonik. Berikut beberapa opsi lagi:

Gunakan awkdan 'sebagai pembatas bidang (dengan asumsi semua baris memiliki format yang sama):

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

Lakukan semuanya dalam perl:

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

Gunakan regex yang lebih sederhana dan parsing hasilnya:

$ 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
terdon
sumber