Utiliser une variable dans une commande sed

je n'arrive pas à utiliser une variable dans un sed de commande, par exemple:

sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas

je veux $ct_tname la variable, pas littéralement $ct_tname, qui est ce que je reçois.

Quelqu'un sait comment obtenir que cela fonctionne?

Le problème est en réalité plus complexe et j'ai omis certaines informations.

ct_fname="%let outputfile="/user/ct_"".csv";"

Ici est l'argument passé au début de mon script bash (sed est lancé dans un script bash).

Cela ne fonctionne pas avec succès, mais il fonctionne si je remplace ct_fname

ct_fname="%let table=ct_;"

Est-il possible d'obtenir le premier ct_fname à passer avec succès?

24
demandé sur Benjamin W. 2012-06-22 00:20:00
la source

6 ответов

vous devez utiliser des guillemets (") au lieu de guillemets (

dans mon cas, je viens de remplacer les guillemets simples par les guillemets doubles:

for a in $(cat ext.cnf); do sed -n "/$a$/p" file1 >> file2; done

Pour l'instant, il fonctionne bien...

4
répondu Garik 2014-07-17 14:51:57
la source

vous devez utiliser double (") guillemets, avec simple (') cite la valeur de la variable n'est pas remplacée. Puisque vous avez des guillemets dans le texte de remplacement, vous devez vous échapper:

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
1
répondu Kenneth Hoste 2012-06-22 00:25:23
la source

Les variables Shell ne sont pas développées entre guillemets simples. Essayez plutôt ceci:

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
1
répondu twalberg 2012-06-22 00:25:51
la source

D'autres réponses mettent l'accent sur l'utilisation de doubles citations évitées dans leurs exemples. Notez que ce n'est pas toujours ce que vous voulez :

$ FOO="auie"; echo foo123bar|sed "s/123/\"$FOO\"/"
foo"auie"bar
$ FOO="auie"; echo foo123bar|sed "s/123/$FOO/"
fooauiebar
$ FOO="auie"; echo fooauiebar|sed "s/\"$FOO\"/123/"
fooauiebar
$ FOO="auie"; echo fooauiebar|sed "s/$FOO/123/"
foo123bar
1
répondu Skippy le Grand Gourou 2014-02-11 15:15:50
la source

Le problème est que lorsque $ct_fname est substitué, sed voir extra / séparateurs, donc

sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas

devient

sed "24s/.*/"%let outputfile=/user/ct_ARGUMENT1.csv;"/" file1.sas > file2.sas

et vous obtiendrez un sed erreur car il y a 5 / au lieu des 3 prévus.

au lieu de cela, changez votre sed séparateurs à un caractère non utilisé comme | ou :, et les guillemets simples et doubles fonctionne très bien:

sed '24s|.*|'$ct_tname'|' file1.sas > file2.sas
sed "24s|.*|"$ct_tname"|" file1.sas > file2.sas
0
répondu Roger Dueck 2018-02-12 18:09:09
la source

Autres questions sur