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?

23
demandé sur Jonathan Leffler 2012-08-21 23:07:29

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.

48
répondu Lev Levitsky 2012-08-21 19:49:48

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

17
répondu c0m3t 2014-10-28 08:29:37

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.

4
répondu Jonathan Leffler 2012-08-21 19:15:49
sed -i "s|$fileWithPath|HAHA|g" file
3
répondu pylover 2018-01-08 17:21:35

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é.

0
répondu FrViPofm 2015-01-12 15:01:39