web-dev-qa-db-fra.com

Remplacer le slash dans Bash

Supposons que j'ai cette variable: 

DATE="04/Jun/2014:15:54:26"

Là, je dois remplacer / par \/ pour obtenir la chaîne:

"04\/Jun\/2014:15:54:26"

J'ai essayé tr comme suit:

echo "04\Jun\2014:15:54:26" | tr '\' '\\/' 

Mais cela se traduit par: "04\Jun\2014:15:54:26"

Cela ne me satisfait pas. Quelqu'un peut-il aider?

18
user109447

Pas besoin d'utiliser un écho + un tuyau + sed.

Une simple variable de substitution est suffisante et plus rapide:

echo ${DATE//\//\\/}

#> 04\/Jun\/2014:15:54:26
47
Luc-Olivier

Utilisez SED pour les substitutions:

 sed 's#/#\\/#g' < filename.txt > newfilename.txt

Vous utilisez habituellement "/" au lieu de "#" mais tant que c'est là, ça n'a pas d'importance. 

J'écris ceci sur un PC Windows donc j'espère que c'est bien, vous devrez peut-être échapper aux barres obliques avec une autre barre oblique.

Sed expliqué, le "-e", vous permet de modifier le fichier en place. Vous pouvez utiliser -i pour créer une sauvegarde automatiquement.

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html
6
n34_panda

voici:

kent$  echo "04/Jun/2014:15:54:26"|sed 's#/#\\/#g'  
04\/Jun\/2014:15:54:26

votre ligne tr n'était pas correcte, vous risquez de mal comprendre ce que tr fait, tr 'abc' 'xyz' va changer a->x, b->y, c->z, ne pas changer tout abc->xyz ..

3
Kent

Cela n’a pas été dit dans d’autres réponses, j’ai donc pensé ajouter quelques précisions:

tr utilise deux jeux de caractères pour le remplacement et les caractères du premier jeu sont remplacés par ceux du second jeu dans une correspondance un à un. La page de manuel indique que

SET2 est étendu à la longueur de SET1 en répétant son dernier caractère si nécessaire. Les caractères en excès de SET2 sont ignorés.

Exemple:

echo abca | tr ab de    # produces decd
echo abca | tr a de     # produces dbcd, 'e' is ignored
echo abca | tr ab d     # produces ddcd, 'd' is interpreted as a replacement for 'b' too

Lorsque vous utilisez sed pour les substitutions, vous pouvez utiliser un autre caractère que "/" pour le délimiteur, ce qui rendra votre expression plus claire (j'aime utiliser ":", @ n34_panda a proposé "#" dans leur réponse). N'oubliez pas d'utiliser le modificateur /g pour remplacer toutes les occurrences: sed 's:/:\\/:g' avec des guillemets ou sed s:/:\\\\/:g sans (les barres obliques inverses doivent être échappées deux fois).

Enfin, votre solution la plus courte sera probablement la réponse de Luc-Olivier, impliquant une substitution, sous la forme suivante (n'oubliez pas d'échapper également aux barres obliques lorsqu'elles font partie du modèle attendu):

echo ${variable/expected/replacement}     # will replace one occurrence
echo ${variable//expected/replacement}    # will replace all occurrences
0
Alex M

Vous pouvez également échapper aux barres obliques, avec une solution légèrement moins lisible qu'avec les hachages:

echo "04/Jun/2014:15:54:26" | sed 's/\//\\\//g'

0
mmorin