Je suis un novice relatif à Linux. Supposons que j'ai un fichier texte a.txt
qui contient le texte suivant :
A
B
C
Maintenant, si je veux changer le texte de la ligne 2 (qui contient B
), je peux utiliser le sed
suivant commande :
sed -i '2s/^.*$/X/' a.txt
pour changer le B
à X
, par exemple.
Mais supposons maintenant que je veuille écrire un sed
commande qui change le texte de la ligne 2 en quelque chose qui inclut une variable de chaîne bash. Je veux changer le texte de la ligne 2 en fname="myaddress"
, où les guillemets sont inclus explicitement, et où myaddress
est une variable de chaîne bash (défini ailleurs). Pour essayer de faire cela, j'ai créé un script shell bash appelé mytest.sh
et contenant les éléments suivants :
#!/bin/bash
myaddress="/home/"
echo fname="$myaddress"
head a.txt
sed -i '2s/^.*$/fname="$myaddress"/' a.txt
head a.txt
Maintenant, echo fname="$myaddress"
imprime fname="/home/"
, qui est le texte que je veux être sur la ligne 2 de a.txt
. Cependant, sed
imprime à la place fname="$myaddress"
à la ligne 2 de a.txt
, probablement parce qu'il se trouve à l'intérieur des apostrophes environnantes. En d'autres termes, la sortie du script shell bash ci-dessus est :
fname="/home/"
A
B
C
A
fname="$myaddress"
C
Ma question est, comment puis-je obtenir sed
pour imprimer réellement la valeur stocké dans myaddress
et référencé par $myaddress
?
Réponse acceptée :
Il y a deux problèmes :Premièrement, comme Kevin l'a déjà noté, les variables du shell doivent être placées entre guillemets doubles si elles doivent être développées par le shell. Deuxièmement, votre chaîne de remplacement contient un /
, vous ne pouvez donc pas utiliser /
en même temps qu'un délimiteur pour sed
. Si vous savez qu'un caractère, dites ,
, n'apparaîtra certainement pas dans la chaîne de remplacement, vous pouvez utiliser ce caractère comme sed
délimiteur, vous obtenez donc
sed -i '2s,^.*$,fname="'"$myaddress"'",' a.txt