GNU grep -P ile perl uyumlu regex kullanma


10

Bu regex (?<=\[')[^,]*aşağıdaki satırı içeren bir dosyada kullanıyorumdisk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

Bunun geri dönmesini istiyorum OVS/sdasd/asdasd/asdasd/something.img

Çalıştırmak için nasıl kullanabilirim grep?

Denedim grep -P "(?<=\[')[^,]*"ama tüm satırı döndürür.

Yanıtlar:


14

Ekle -oböylece anahtarı grepiçin grepping ediyoruz modeliyle eşleştiği neyi sadece getiri:

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

6

Ayrıca sed, daha fazla taşınabilirlik için arama iddiası olmadan da kullanabilirsiniz ( -osizin için uygun olmayabilir grep):

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

Ters eğik çizginin "tuhaf" kullanımının burada kaçtığına dikkat edin. Bunun nedeni, sedvarsayılan olarak BRE'leri kullanmasıdır ( bu soruya bakın ).

Taşınabilirlikten bahsetmişken, neden sadece Perl kullanmıyorsunuz?

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

2

@slm zaten kanonik cevabı verdi. İşte birkaç seçenek daha:

Alan ayırıcı olarak awkve kullan '(tüm satırların aynı biçime sahip olduğu varsayılarak):

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

Her şeyi perl'de yapın:

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

Daha basit bir normal ifade kullanın ve sonuçları ayrıştırın:

$ 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.