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?
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
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
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
..
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
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'