web-dev-qa-db-fra.com

Comment utiliser sed pour remplacer le groupe de capture regex?

J'ai un gros fichier avec de nombreux chemins de fichiers dispersés qui ressemblent à

lolsed_bulsh.png

Je veux ajouter ces noms de fichiers avec un chemin étendu comme:

/full/path/lolsed_bullsh.png

J'ai du mal à faire correspondre et capturer ces derniers. actuellement j'essaye des variations de:

cat myfile.txt| sed s/\(.+\)\.png/\/full\/path\/\1/g | ack /full/path

Je pense que sed a un regex ou capture un comportement de groupe que je ne comprends pas

13
kevzettler

sed utilise POSIX BRE et BRE ne prend pas en charge un ou plusieurs quantificateurs + . Le quantificateur + est seulement pris en charge dans POSIX ERE . Cependant, POSIX sed utilise BRE et n'a pas d'option pour passer à ERE .

Utilisation ..* simuler .+ si vous souhaitez conserver la portabilité.

Ou si vous pouvez supposer que le code est toujours exécuté sur GNU sed, vous pouvez utiliser GNU extension .\+. Alternativement, vous pouvez également utiliser l'extension GNU -r flag pour passer à POSIX ERE. Le -E drapeau dans réponse de higuaro est n drapeau non documenté pour la compatibilité avec BSD sed avec le même effet.

7
nhahtdh

Dans votre regex change + avec *:

sed -E "s/(.*)\.png/\/full\/path\/\1/g" <<< "lolsed_bulsh.png"

Il imprime:

/full/path/lolsed_bulsh

REMARQUE: Le non standard -E L'option est d'éviter de s'échapper ( et )

22
higuaro

Évitez de vous échapper en choisissant un séparateur différent (et option -E), par exemple:

cat myfile.txt | sed -E "s|(..*)\.png|/full/path/\1|g" | ack /full/path
3
Cezariusz