Menu

Problème substitution avec ed /old/new/[gp] [Fermé]

- - Dernière réponse :  gnugo - 12 mars 2012 à 18:27
Bonjour,

En utilisant la substitution par expression régulière de ed, je voudrais en une seule fois matcher une chaine selon un critère et modifier son contenu si cela correspond :
Cela va s'appliquer sur une liste de noms de fichiers avec leur chemin,
j'ai besoin de modifer certains fichiers selon leur nom, ce qui donne la chaine suivante :

/.*\/nomfichier$/\/nouveauchemin\/nomfichier/

donc /tmp/essai/nomfichier donne /nouveauchemin/nomfichier

Sauf qu'il me faut aussi l'ancien chemin dans le nouveau nom, sous la forme : /nouveauchemin/tmp-essai-nomfichier

Mais comment à la fois matcher un nom particulier et remplacer tous les '/' par des '-' ?

Je ne vois pas comment faire, je peux récupérer l'expression matchée avec &, mais il me faut ensuite faire un traitement sur &

ps : Si je suis limité à une seule substitution, c'est parce que j'utilise en fait pax avec l'option -s, qui substitue les noms de fichiers avec la même syntaxe que ed

Merci
Afficher la suite 

2 réponses

Messages postés
36562
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
16 juin 2019
3608
0
Merci
Salut,

Il suffit juste de matcher le "motif" voulu et d'opérer une substitution sur le chemin (en changeant le délimiteur par défaut, le slash (/) par un caractère quelconque, ici le point-virgule (;)) :

$ cat plop 
/home/moi/documents/fich.txt
/home/moi/documents/toto.jpg
/home/moi/documents/tata.pdf

$ ed -s plop <<<$'/toto.jpg/ s;/.*/;/mnt/brol/archive/;\n,p'
/home/moi/documents/fich.txt
/mnt/brol/archive/toto.jpg
/home/moi/documents/tata.pdf

$ 

;-))
0
Merci
Salut et merci,

Mais je n'ai pas bien compris pourquoi tu changes le délimiteur par défaut par le ; ?

En fait ce que je cherche à obtenir c'est
/home/moi/documents/fich.txt
/mnt/brol/archive/-home-moi-documents-toto.jpg
/home/moi/documents/tata.pdf
Le $' ' signifie quoi au juste ?
zipe31
Messages postés
36562
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
16 juin 2019
3608 -
C'est la syntaxe propre à la redirection (<<<). Ça sert à faire interpréter à "ed" ce qui se trouve entre les quotes simples.

Pour toi ce qui importe c'est juste la syntaxe qui se trouve entre ces quotes :
/toto.jpg/ s|/|-|g\n/toto/s|.*|/mnt/brol/archive/&|\n
Ok je vois le $' ' interprète certains caractères comme le \n
Donc tu fais bien 2 commandes de substitution. |/|-|g et .*|/mnt/brol/archive/&|

Hélas c'est inapplicable pour moi car je l'utilise avec pax : pax -s "/old/new/g"
Je peux préciser plusieurs -s, mais il s'arrête à la première substitution réussie

C'est pour ça que je cherche à le faire en une seule fois, et que je suis venu chercher de l'aide ici
:-(
zipe31
Messages postés
36562
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
16 juin 2019
3608 -
Je peux préciser plusieurs -s, mais il s'arrête à la première substitution réussie
Ça va être difficile de passer outre ;-(
Oui je sais c'est pas facile :(
Et tar,cpio qui permettent même pas de renommer les noms de fichiers qu'on archive! Heureusement que pax est toujours là ...il va falloir coder soi même son propre archiveur en C pour pouvoir faire des choses