Utiliser une expression rationnelle compatible perl avec GNU grep -P


10

J'utilise cette expression régulière (?<=\[')[^,]*sur un fichier contenant la ligne suivantedisk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

Je veux que ça revienne OVS/sdasd/asdasd/asdasd/something.img

Comment puis-je l'utiliser greppour le faire fonctionner?

J'ai essayé grep -P "(?<=\[')[^,]*"mais ça renvoie toute la ligne.

Réponses:


14

Ajoutez le -ocommutateur pour que grepne renvoie que ce qui correspond au modèle que vous attendez:

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

6

Vous pouvez également utiliser sedsans l'assertion de lookaround pour une plus grande portabilité ( -opeut ne pas être disponible pour votre grep):

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

Notez l'utilisation "étrange" des échappements antislash ici. Cela est dû au fait que les sedBREs sont utilisés par défaut (voir cette question ).

En parlant de portabilité, pourquoi ne pas simplement utiliser Perl?

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

2

@slm vous a déjà donné la réponse canonique. Voici quelques options supplémentaires:

Utilisez awket 'comme délimiteur de champ (en supposant que toutes les lignes ont le même format):

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

Faites le tout en perl:

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

Utilisez une expression rationnelle plus simple et analysez les résultats:

$ 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.