Comment remplacer un chemin par un autre chemin dans sed?
j'ai un script csh (bien que je puisse changer de langue si cela a un quelconque rapport) où je dois:
sed s/AAA/BBB/ file
<!-Le problème est que AAA et BBB sont des chemins, et donc contiennent'/'. AAA est fixe, donc je peux dire que:
sed s/\/A\/A\A/BBB/ file
cependant, BBB est basé sur des variables, y compris $PWD. Comment puis-je échapper au " / " en $PWD?
<!-Ou y a-t-il un autre moyen que je devrais faire tout ça?5 réponses
sed
peut utiliser n'importe quel séparateur au lieu de /
dans le s
la commande. Utilisez juste quelque chose qui n'est pas rencontré dans vos chemins:
s+AAA+BBB+
et ainsi de suite.
alternativement (et si vous ne voulez pas deviner), vous pouvez pré-traiter votre chemin avec sed pour échapper aux slashs:
pwdesc=$(echo $PWD | sed 's_/_\/_g')
et ensuite faire ce dont vous avez besoin avec $pwdesc
.
dans les cas où la chaîne de remplacement ou la chaîne de motif contient des slashes, vous pouvez utiliser le fait que GNU sed autorise un délimiteur alternatif pour la commande de remplacement. Les choix communs pour le délimiteur sont le caractère pipe / ou le # hash - le meilleur choix de délimiter le caractère dépendra souvent du type de fichier traité. Dans votre cas vous pouvez essayer
sed -i 's#/path/to/AAA#/path/to/BBB#g' your_file
Note: Le g après le dernier # est de changer toutes les occurrences dans le fichier si vous voulez changer première ouccurence ne pas utiliser de g
en utilisant csh
pour le sérieux de 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:
sed -e "s=$oldpath=$newpath="
où la variable shell $oldpath
contient la valeur à remplacer et $newpath
contient le remplacement, et il est supposé qu'aucune des variables ne contient le signe égal. Qui est, vous êtes autorisé à choisir le délimiteur sur le patron, et éviter l'habituelle /
délimiteur évite les problèmes avec les slashs dans pathnames. Si vous pensez que =
peut apparaître dans vos noms de fichier, choisissez quelque chose de moins probable à apparaître, comme le contrôle-a ou le contrôle-G.
vous pouvez utiliser l'extension entre parenthèses ${i/p/r}
pour échapper aux entailles.
Dans ce cas ${i//p/r}
pour échapper à tous les événements.
$p1=${p1//\//\/}
$p2=${p2//\//\/}
sed s/$p1/$p2/ file
Ou, plus concise, dans une ligne sed s/${p1//\//\/}/${p2//\//\/}/ file
les deux coups de poing //
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é.