Comment remplacer un chemin avec un autre chemin de sed?
J'ai un script csh (même si je peux changer la langue si elle a une quelconque pertinence) où j'ai:
sed s/AAA/BBB/ file
Le problème est que AAA et BBB sont des chemins d'accès, et donc contenir des '/'. AAA est fixe, donc je peux dire:
sed s/\\\/A\\\/A\\\A/BBB/ file
Cependant, BBB est basé sur les variables, y compris $PWD. Comment puis-je échapper à la '/' dans $PWD?
OU est-il une autre façon pour moi de faire cela?
Vous devez vous connecter pour publier un commentaire.
sed
pouvez utiliser n'importe quel séparateur à la place de/
dans les
de commande. Suffit d'utiliser quelque chose qui n'est pas rencontrée dans vos chemins d'accès:et ainsi de suite.
Sinon (et si vous ne voulez pas à deviner), vous pouvez pré-traiter votre chemin avec sed pour échapper à la slash:
et ensuite faire ce dont vous avez besoin avec
$pwdesc
.\b
correspondre à un mot, mais à quoi correspondent à un chemin? C'est parce que je veux ajouter un chemin d'accès avant un nom de fichier et je veux éviter de faire deux fois.\b
correspond à une limite de mot, btw. Peut-être que vous devriez essayer de poser une nouvelle question (ou à la recherche de ceux existants)?"crti.o
ou$(crti.o)
j'ai besoin de apend/var/path/
devant eux, mais le sed commande est appelée à plusieurs reprises afin de devenir"/var/path//var/path//var/path//var/path/crti.o
ou$(/var/path//var/path/crti.o)
.\b[^\/]\w*
, ou similaire. Mais je ne vois pas de lien direct avec ma réponse que nous commentons maintenant.How to replace a path with another path in sed
.Dans le cas où la chaîne de remplacement ou de la chaîne de modèle contient une barre oblique, vous pouvez utiliser le fait que GNU sed permet à un autre délimiteur pour la commande de substitution. Choix communs pour le délimiteur sont le caractère pipe | ou le dièse # - le meilleur choix de la délimitation de caractère dépendra du type de fichier en cours de traitement. Dans votre cas vous pouvez essayer
Remarque: Le g après la dernière # est pour modifier toutes les occurrences dans le fichier si vous souhaitez modifier la première ouccurence ne pas utiliser de g
À l'aide de
csh
grave pour le script est généralement pas recommandé. Cependant, c'est tangentielle à la question à portée de main.Vous êtes probablement après quelque chose comme:
où la variable shell
$oldpath
contient la valeur qui doit être remplacé et$newpath
contient le remplacement, et il est probable que ni variable contient un signe égal. Qui est, vous êtes autorisé à choisir le délimiteur sur le patron, et en évitant les habituelles/
séparateur permet d'éviter les problèmes avec des barres obliques dans les chemins d'accès. Si vous pensez que=
peut apparaître dans vos noms de fichiers, choisissez quelque chose de moins susceptible d'apparaître, tels que le contrôle ou le contrôle-G.Vous pouvez utiliser des parenthèses expansion
${i/p/r}
pour échapper à l'barres obliques.Dans ce cas
${i//p/r}
pour échapper à toutes les occurrences.Ou, plus concise, dans une ligne
sed s/${p1//\//\\/}/${p2//\//\\/}/file
Les deux poing barres obliques
//
sont un séparateur entre parenthèses expansion en disant: nous sommes correspondant à l'ensemble des occurrences, puis\/
est pour échapper à la barre oblique dans le modèle de recherche, les/
comme un deuxième séparateur dans l'expansion, puis\\/
est le remplacement, dans la sorcière de la barre oblique inverse doit être échappé.Nous avons juste besoin d'obtenir /h/réseau références de chemin en dehors de la trajectoire. si nous avons fait leur retour à l' /c/disque qu'ils seraient carte inexistant répertoires, mais de les résoudre rapidement. Dans mon .bashrc j'ai utilisé