J'essaie de trouver et de remplacer un contenu de texte spécifique à l'aide de la commande SED et de l'exécuter via un script shell.
ci-dessous est le script d'échantillon que j'utilise: p> et exécuter la même chose en passant les arguments: p> mais si la chaîne d'argument contient Comment puis-je vous assurer que les valeurs à l'intérieur des variables ne sont pas développées en raison du sh fichier test.sh p> fichier texte fichier nom_txt p> sorties p> 1)
./test.sh upd up upd upon world p> 2)
./test.sh upd upd upd hello '$ APR1 $ hosgaxyv $ d0kxp5dcyz2buycs9bmhu1' p> dans les deux cas, il ne remplace pas le contenu p> p> P> $ code>, il enfreint les commandes et elle remplace par des valeurs incorrectes, comme p>
$ code>? p>
mise à jour h2>
3 Réponses :
Mettez les arguments de ligne de commande qui sont des noms de fichiers en guillemets simples:
L'évaluation stupide empêche probablement cela de travailler, de sorte que ce n'est pas suffisant.
Vous n'avez pas besoin Lorsque vous appelez votre script, vous devez échapper à tout eval code> ici du tout:
S code> avec
/ code> (ne comporte pas vraiment dans l'exemple). LI>
\ 1 code> pour référencer le premier groupe de capture au lieu de répéter la variable dans la substitution. LI>
$ {2 // '$' / '\ $'} code> au lieu de
2 $ code> (et similaire pour
$ 3 ). Cela échappe à tous les
$ code> comme
\ $ code>; Ceci est nécessaire en raison de la cotisation double, ou du
code> se faire manger par la coque avant que SED ne cesse de les voir. Li>
ul>
$ code> dans l'entrée ou si la coquille tente de les développer en tant que noms variables: P>
./test.sh update asd '$apr1$HnIF6bOt$9m3NzAwr.aG1Yp.t.bpIS1.'
Mais quand je déclenche la même chose avec $ APR1 $ hnif6bot $ 9m3nzawr.ag1yp.t.bpis1. En tant que 3ème argument, son remplaçant de la chaîne après la dernière «$» .. Ie 'm3nzawr.ag1yyp.t.bpis1'
J'utilisais en blanc comme séparateur S parce que ma chaîne peut avoir "/" dans la valeur.
@Andromeda Vous devez également devoir citer $ code> lorsque vous appelez votre commande, j'ai ajouté un exemple d'utilisation.
sa ne fonctionne pas pour moi ... J'ai même essayé avec des intrants qui n'ont pas de $ .. Son ne remplace pas le contenu
@Andromeda êtes-vous sur MacOS, par hasard?
Non..Je avez la machine Windows connectée à mon serveur Linux via SSH.
@Andromeda Essayez d'ajouter SET -VX CODE> à votre script pour voir ce qui est exécuté exactement.
@Andromeda Utilisez -I -E code> au lieu de
--ieieie code>, je l'ai eu mal au début de ma réponse.
Oui. Je n'ai même pas manqué que lorsque je le colle en collé. Maintenant, il remplaçant les intérêts. Mais avec quelques citations supplémentaires pour chaque $ au lieu de $ APR1 $ HNIF6BOT $ 9m3nzawr.ag1yP.t.bpis1 Il remplace avec '$' APR1 'APR1' $ 'hnif6bot' $ '9m3nzawr.ag1yp.t.bpis1
Non seulement cela ..Si ma chaîne contient '/', ce n'est pas là dans la sortie. (La raison pour laquelle j'utilisais vide en tant que sépérateur pour S
Suppression des devis simples et fonctionnent comme prévu SED -I -E "S ($ {2 // //$/\$ =).* \ 1: $ {3 // $ / \ $} g" "
doit protéger tous les arguments de script avec des guillemets si vous disposez d'espace et de shell spécial, et de l'échapper s'il s'agit d'un dollar $ code> et
-ei code> au lieu de -ie même Mieux vaut tomber en premier pour le test, peut l'ajouter plus tard si vous êtes vraiment sûr de
J'admets que je ne voudrais pas dire à votre regex alors allons simplement entrer dans le gist de solution, pas besoin d'eval;
Pourquoi avez-vous besoin
eval code> du tout?
@Benjaminw. Je pensais que c'est le moyen d'exécuter les commandes dynamiques. Havent a utilisé des scripts jusqu'à présent. Et je ne connais même pas les bases de celui-ci. Donc je suis toutes les oreilles
Qu'est-ce que
fileename.txt code> ressemble, et pourquoi n'est-ce pas simplement un fichier de définitions de fonction que vous pouvez provenir, de sorte que vous puissiez appeler la fonction appropriée au lieu d'utiliser
eval code >?
@cheppner C'est le fichier htpasswd avec nom d'utilisateur et mot de passe cryptés
Désolé, j'ai mal interprété la mission; Je pensais que vous essayiez d'exécuter le résultat i> de
sed code> en tant que commande.