Utilisation d'une regex compatible avec perl avec GNU grep -P

J'utilise cette regex (?<=\[')[^,]* Sur un file contenant la ligne suivante disk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

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

Comment utiliser grep pour le faire fonctionner?

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

Ajoutez le commutateur -o pour que grep ne renvoie que ce qui correspond au model pour lequel vous voulez:

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

Vous pouvez également utiliser sed sans l'assertion lookaround pour une plus grande portabilité ( -o peut ne pas être disponible pour votre grep ):

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

Notez l'utilisation "étrange" de la barre oblique inverse ici. Cela est dû au fait que sed utilise les BRE par défaut (voir cette question ).

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

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

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

Utilisez awk et ' 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 

Faire tout cela dans perl:

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

Utilisez une regex plus simple et parsingz 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