Comment utiliser une variable shell à l'intérieur de la command sed?

nous soaps que nous pouvons get la valeur d'une variable en utilisant $ sign:

x=3 echo $x 3 

Y a-t-il d'autres moyens que nous pouvons utiliser pour get la valeur sans utiliser $ sign.

Je request ceci parce que $ sign est un caractère spécial pour sed , et je reçois sed: -e expression #1, char 31: unterminated s' command erreur de sed: -e expression #1, char 31: unterminated s' command en essayant de faire ceci:

 A=25 #lineNumber destStr="192.168.1.3 192.168.1.4" sed ""$A"s/Allow from .*/Allow from $destStr/" -i test2 

et il imprime la string destStr (pas la valeur) quand j'utilise le caractère d'échappement \ :

 sed ""$A"s/Allow from .*/Allow from \$destStr/" -i test2 

utilisant l' echo au lieu de sed :

 25s/Allow from .*/Allow from 192.168.1.3 192.168.1.4 / -i test2 

Comme les modifications finales l'ont révélé, le problème n'est pas lié au signe dollar, mais est dû au contenu de deststr , qui n'est pas 192.168.1.3 192.168.1.4 mais deux lignes, l'une contenant seulement 192.168.1.3 et l'autre contenant seulement 192.168.1.4 , les deux lignes se terminant par un caractère de nouvelle ligne. C'est-à-dire que la command réelle après le rlocation de variable est:

 sed "25s/Allow from .*/Allow from 192.168.1.3 192.168.1.4 /" -i test2 

Maintenant sed interprète sa command line par ligne, et ainsi la première command qu'elle essaye d'interpréter est:

 25s/Allow from .*/Allow from 192.168.1.3 

qui est clairement une command non terminée, et donc rapporté par sed comme tel.

Maintenant, la solution que vous avez trouvée, en utilisant l' echo , fonctionne parce que

 echo $var 

appelle echo avec deux arguments (car l'espace n'est pas guidé, il est interprété comme un séparateur d'argument), le premier étant 192.168.1.3 et le second étant 192.168.1.4 ; les deux sont des forms qui ne sont pas interprétées plus loin par le shell.

Maintenant, echo sort juste ses arguments (non-option) séparés par un espace, donc vous obtenez maintenant comme command line:

 sed "25s/Allow from .*/Allow from 192.168.1.3 192.168.1.4/" -i test2 

comme prévu.

Notez cependant que pour la substitution des commands, au lieu des backticks, vous devriez utiliser $() autant que possible, car il est trop facile d'get des backticks erronés. Par conséquent, la suite fait ce que vous voulez:

 sed "$A s/Allow from .*/Allow from $(echo $destStr)/" -i test2 

Notez que j'ai aussi profité du fait que sed permet un espace entre adresse et command, pour simplifier la citation. Dans les situations où un tel espace supplémentaire n'est pas possible, vous pouvez également utiliser la syntaxe suivante:

 sed "${A}s/Allow from .*/Allow from $(echo $destStr)/" -i test2 

Notez également que cela dépend du fait que les caractères non-espace dans destStr sont interprétés ni par le shell, ni par sed si cela se produit dans la string de rlocation.

J'ai réussi à résoudre mon problème en utilisant echo avec “:

 sed ""$A"s/Allow from .*/Allow from `echo $destStr`/" -i test2 

mais je veux toujours savoir s'il existe d'autres façons d'get la valeur sans utiliser $ sign.

Voici comment vous pouvez le faire dans le script:

 sed -e "${A}s/Allow from .*/Allow from ${destStr}/" -i test2 

En utilisant ${variable} laissez le bash interpréter ${variable}s/... comme vous le voulez.

En essayant de répondre à la question posée: «Y a-t-il d'autres moyens que nous pouvons utiliser pour get la valeur sans utiliser $ sign.

Ce n'est pas dans le context de votre cas d'utilisation, mais vous pourriez faire quelque chose comme ceci:

 $SOME_VAR="some value or something" f() { echo ${!1}; } some_command `f "SOME_VAR"` 

Vous pouvez utiliser ceci pour éviter d'utiliser $ dans la list d'arguments de sed.

Qu'en est-il de

 sed $A's/Allow from .*/Allow from '$destStr'/' -i test2 

en supposant que destStr n'a pas de blanc.

ou

 echo $A"s/Allow from .*/Allow from $destStr/" | sed -f - -i test2 

la deuxième forme permet le blanc.