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
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.
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 )
É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