2012-06-21 7 views
21

I nie wydaje się użyć zmiennej w poleceniu sed, na przykład:użyć zmiennej w poleceniu sed

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

chcę $ct_tname zmienną, nie dosłownie $ct_tname, czyli to, co wciąż otrzymuję .

Ktoś wie, jak to uruchomić?

Problem jest w rzeczywistości bardziej złożony i pominąłem niektóre informacje.

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

Tutaj $1 jest argument przekazany na początku mojego skryptu bash (sed jest prowadzony wewnątrz skryptu bash).

nie zakończą się pomyślnie, ale to działa, czy mogę wymienić ct_fname z

ct_fname="%let table=ct_$1;" 

Czy istnieje sposób, aby uzyskać pierwsze ct_fname być zdany?

+0

możliwe duplikat [Jak użyć zmiennej skryptu bash z sed] (http://stackoverflow.com/questions/3204302/how-to-use-a-bash-script-variable-with-sed) –

+0

możliwy duplikat [sed scripting - substytucja zmiennych środowiskowych] (http: // stackoverflow. com/questions/584894/sed-scripting-environment-variable-substitution) – tripleee

Odpowiedz

34

Musisz użyć podwójnego cudzysłowu (") zamiast pojedynczych cytatów ('). Pojedyncze cytaty przekazują ich treści dosłownie, bez tłumaczenia zmiennych (ekspansja).

spróbować

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

btw, jeśli masz zamiar być edycję pliku (czyli jeśli file2.sas jest tymczasowy plik), należy używać ed zamiast.

+0

pojawił się tak wiele razy na SO że powinien zostać zbanowany, aby ponownie uzyskać odpowiedź: P Myślę, że S.O. powinno uniemożliwić wysłanie pytania, jeśli znajdzie podobny temat, no, nie przeszkadza, ale ostrzegaj przed opublikowaniem, że podobne pytanie już zostało udzielone, i niech użytkownicy sprawdzą to, zanim zaczną publikować swoje pytanie. – c00kiemon5ter

+0

W rzeczywistości, mój problem jest nieco bardziej złożony i nie został rozwiązany przez zwykłą zmianę "na", edytowane pytanie jest powyżej. Myślę, że problem, z którym się spotykam, jest dość trudnym zadaniem, a nie zwykłym zapytaniem, które pojawia się w SO w odniesieniu do tego. – user788171

1

Należy użyć podwójnych (") cytatów, z pojedynczymi (') ofertami wartość zmiennej nie zostanie zamieniona. Ponieważ masz podwójne cudzysłowy w tekście zastępczym, musisz im uciec:

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

Zmienne powłoki nie są rozwijane wewnątrz pojedynczych cudzysłowów. Spróbuj zamiast tego:

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

Inne odpowiedzi dotyczą wykorzystania w swoich przykładach podwójnych cudzysłowy z Escaped. Należy pamiętać, że nie zawsze jest to, co chcesz:

$ 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 
3

W moim przypadku, po prostu remplaced apostrofów przez te podwójne:

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

Na razie to działa dobrze ...

0

problemem jest to, że gdy $ct_fname jest podstawiony sed widzi dodatkowe / separatory tak

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

staje

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

a dostaniesz błąd sed ponieważ istnieje 5 / zamiast oczekiwanego 3.

Zamiast zmienić sed separatory do nieużywanego znaku podobnego | lub : i albo pojedyncze lub podwójne cudzysłowy będzie działać dobrze:

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