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