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