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.

GxFlint
la source

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
slm
la source
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
Joseph R.
la source
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
terdon
la source