Je veux faire:
cat update_via_sed.sh | sed 's/old_name/new_name/' > new_update_via_sed.sh
dans mon programme.
Mais je veux utiliser des variables, par exemple
old_run='old_name_952'
new_run='old_name_953'
J'ai essayé de les utiliser mais la substitution n'a pas lieu (pas d'erreur). J'ai essayé:
cat update_via_sed.sh | sed 's/old_run/new_run/'
cat update_via_sed.sh | sed 's/$old_run/$new_run/'
cat update_via_sed.sh | sed 's/${old_run}/${new_run}/'
Réponses:
Vous pourriez faire:
Mais attention, cela
$old_run
serait pris comme une expression régulière et donc comme tout caractère spécial contenu dans la variable, tel que/
ou.
devant être échappé . De même, dans$new_run
, les caractères&
et\
doivent être traités de manière spécifique et vous devez y échapper/
.Si le contenu de
$old_run
ou$new_run
n'est pas sous votre contrôle, il est essentiel d'exécuter cette échappement, sinon le code équivaut à une vulnérabilité d'injection de code .la source
sed
seul n'utilisera pas regex mais lesed -E
ferait?-e
est de spécifier unsed
e Xpression , de sorte que vous pouvez passer plus d'un (comme danssed -e exp1 -e exp2
) ou des combinaisons de fichiers et expressions (sed -f file -e exp
). Vous pouvez être déroutant avec-E
quoi avec certaines implémentations, dit à sed d'utiliser des ERE au lieu de BRE.-E
je ne maîtrise que la regex étendue, pas la régulière. Merci pour l'explicationsed
implémentations pour des syntaxes d'expression encore plus régulières.Cela a fonctionné:
Comme je veux «réutiliser» le même fichier, je l’utilise en fait pour tous ceux qui souhaitent une approche similaire:
Ce qui a été créé ci-dessus crée un nouveau fichier puis supprime le fichier en cours et le renomme en fichier.
la source
sed -i s/"$old"/"$new"/ update_via_sed.sh
. Cependant, sachez que cela ne fonctionne pour aucune valeur d'ancien ou de nouveau. Par exemple, il ne doit pas contenir / etc., car $ old est toujours une recherche et $ new un modèle de remplacement dans lequel certains caractères ont une signification particulière.sed -i "s/$old/$new/"
est ok aussi (avec les précautions ci-dessus).sed
considère généralement que le séparateur est le premier caractère après las
commande - c'est-à-dire que si vos variables contiennent des barres obliques/
mais ne permettent pas de dire at (@
), vous pouvez utiliser "s @ $ old @ $ new @".Vous pouvez utiliser des variables dans sed tant qu'il s'agit d'un guillemet double (pas d'un guillemet simple):
Si vous avez une barre oblique (
/
) dans la variable, utilisez un séparateur différent, comme ci-dessousla source
|
comme dans mon cas, les variables contient un chemin il a/
en elle|
fonctionné pour moi sur MacOS 10.14, mais d'autres séparateurs l'aiment@
ou#
non. J'avais aussi des barres obliques dans mon env var.'in-place' sed (en utilisant le drapeau -i) était la réponse. Merci à Peterph.
la source
s@
(ce qui n’est en aucun cas spécial pour le shell). Le mieux est de tout mettre entre guillemetssed -i "s@$old@$new@" file
. Notez que ce-i
n'est pas unesed
option standard .$
dans cette commande. Comme, je vais changer$xxx
dans son ensemble à la valeur d'une variable$JAVA_HOME
. J'ai essayésed -i "s@\$xxx@$JAVA_HOME@" file
, mais l'erreur ditno previous regular expression
man bash
donne ceci à propos d'une seule citationPeu importe ce que vous tapez sur la ligne de commande, bash l'interprète puis il envoie le résultat au programme auquel il est censé être envoyé. Dans ce cas, si vous utilisez
sed 's/$old_run/$new_run/'
, bash le voit en premiersed
, il le reconnaît comme un exécutable présent dans la$PATH
variable . L'sed
exécutable nécessite une entrée. Bash cherche l'entrée et trouve's/$old_run/$new_run/'
. Les guillemets simples disent bash de ne pas interpréter le contenu qu'ils contiennent et de les transmettre tels quels. Alors, bash les transmet ensuite à sed. Sed donne une erreur car$
peut se produire uniquement en fin de ligne.Au lieu de cela, si nous utilisons des guillemets doubles, ie
"s/$old_run/$new_run/"
,, alors bash le verra et interprétera$old_run
comme un nom de variable et effectuera une substitution (cette phase est appelée développement de variable). C'est bien ce dont nous avions besoin.Mais vous devez faire attention en utilisant les guillemets doubles, car ils sont interprétés d’abord par bash, puis donnés à sed. Donc, certains symboles comme `doivent être évités avant de les utiliser.
la source
Risque de désinvolture - avez-vous réfléchi
perl
?Ce qui, entre autres choses, est assez efficace pour effectuer des opérations de type "sed", mais constitue également un programme de programmation plus complet.
Dans votre exemple, il semble que vous essayez réellement d’augmenter un nombre.
Alors que diriez-vous de:
ou comme une ligne - style sed:
la source
En
$d1
stockant des valeursJe ne peux pas remplacer la valeur de la variable, alors j'ai essayé la commande suivante, ça marche
guillemet double manquant
"${d1}"
, c’est l’erreurla source
Assumé
$old_run
et$new_run
sont déjà mis:Cela montre le changement à l'écran. Vous pouvez rediriger la sortie vers un fichier si nécessaire.
la source
Pour utiliser une variable dans sed, utilisez des guillemets doubles "" pour inclure la variable dans le modèle que vous utilisez. Par exemple: a = "Hi" Si vous souhaitez ajouter la variable 'a' à un modèle, vous pouvez utiliser le code suivant: sed -n "1, / modèle" $ {a} "modèle / p" nom de fichier
la source
$a
n'est pas cité ici, ce qui signifie que tous les espaces de sa valeur invoqueront la division du mot dans le shell.Vous pouvez également utiliser Perl:
la source
""
) ne feront rien.rompre la ficelle
bad => linux voir une chaîne $ old_run:
bon => linux voir une variable $ old_run:
la source
$old_run
ou$new_run
contient des espaces?