Le remplacement des caractères spéciaux dans un script shell à l'aide de sed
Je suis en train d'écrire un script shell qui remplaceront les caractères/chaînes-je choisir à l'aide de sed. Ma première tentative a travaillé à l'exception des caractères spéciaux. J'ai essayé d'utiliser sed pour fixer les caractères spéciaux afin qu'elles aussi être recherché ou de la remplacer. J'ai décidé de simplifier le script pour tester le dessein, et juste face à un seul caractère fautif. Cependant, je suis toujours avoir des problèmes.
Édité Script
#! /bin/sh
oldString=$1
newString=$2
file=$3
oldStringFixed=$(echo "$oldString" | sed 's/\\/\\\\/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\[/\\\[/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\]/\\\]/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\^/\\\^/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\*/\\\*/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\+/\\\+/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\./\\\./g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/$/\\\$/g')
oldStringFixed=$(echo "$oldStringFixed" | sed 's/\-/\\\-/g')
sed -e "s/$oldStringFixed/$newString/g" "$file" > newfile.updated
mv newfile.updated "$file"#! /bin/sh
Dans le cas où il n'est pas clair, je suis en train de rechercher à travers des oldString pour l' [ personnage, et de le remplacer par une version échappée et d'attribuer les résultats à oldStringFixed (ai-je besoin de backticks pour cela?). Les deux lignes du bas sont des versions légèrement modifiées de mon script original qui, je crois, fonctionne correctement.
Quand je l'écho de la chaîne de caractères fixe, rien n'est affiché, et le sed sorties une erreur
sed: can't read [: No such file or directory
Quelqu'un peut-il expliquer quel Est le problème avec mon premier sed ligne?
EDIT:
Grâce à Jite, le script fonctionne de mieux. Cependant, je suis encore avoir un problème avec le remplacement des simples guillemets caractères avec des espaces, c'est à dire ' *'. La nouvelle version est au-dessus.
Assez similaire à this question.
OriginalL'auteur user3074091 | 2013-12-06
Vous devez vous connecter pour publier un commentaire.
Je suggère deux améliorations:
De ne pas empiler les appels à
sed
comme vous le faites, au lieu de ranger tous d'entre eux dans une seule fonction, commeescape_string
ci-dessous.Vous pouvez utiliser un délimiteur de fantaisie pour les
sed
commande de substitution pour éviter les problèmes liés à/
faisant partie des chaînes concernées.Avec ces changements, votre script ressemble:
s/[][\\^*+.$-]/\\\1/g
(et je ne suis pas sûr de savoir pourquoi vous souhaitez inclure le trait d'union, donc je vous suggère de le retirer).Excellent, j'ai ajouté vos modifications!
Cela ne fonctionne pas pour moi, je reçois "sed: -e expression n ° 1, char 21: référence non valide \1 "s' de la commande du membre de droite"
OriginalL'auteur The Show that never ends
Changement:
:
Problème 1: Espace après
=
, il n'est pas permis lors de l'affectation des variables shell.Problème 2:
sed
s'attend à un fichier en entrée, pas une chaîne de caractères. Vous pouvez pipe comme ma solution ne permet cependant.Problème 3: vous devez Vous échapper de la barre oblique première
\\
, alors vous devez vous échapper de votre char\[
, totalisant\\\[
🙂Note de côté: j'ai changé ` $ () puisque ce dernier est recommandé de la praxis (en raison de la nidification, un autre sujet).
Il peuvent tous être résolus. Franchement, pour ce cas, je ferais un fichier
sed.script
qui contient toutes les commandes qui doivent être exécutées, une par ligne, et ensuite utilisersed -f sed.script
juste une fois, plutôt que de reinvokingsed
à plusieurs reprises. Cela signifie également que vous n'avez pas à s'échapper du script par rapport à la coque — il rend la vie plus facile.Je ne comprends pas votre question. Veuillez mettre à jour votre question avec un exemple d'entrée et de sortie que vous attendez, j'espère que nous pourrons trouver une réponse.
OriginalL'auteur Jite
Pour moi, c'était juste un cauchemar d'essayer d'obtenir sed pour ce faire, pour le cas général. J'ai abandonné et a écrit un court code Python pour remplacer sed:
Qui peut alors être utilisé comme:
OriginalL'auteur Ben Farmer
À remplacer les valeurs contenant des caractères spéciaux essayez d'utiliser sed "|" au lieu de "/"
Par exemple: sed-i 's|'$original_value'|'$nouvelle_valeur'|g'
où original_value="comprising_special_char_/"
nouvelle_valeur="comprising_new_special_char:"
OriginalL'auteur Sushant Dhingra