28

sedコマンドで変数を使用できないようです。例:

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

$ct_tname文字通りではなく、変数が必要です$ct_tname。これは私が取得し続けるものです。

誰かがこれを機能させる方法を知っていますか?

問題は実際にはもっと複雑で、私はいくつかの情報を省略しました。

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

これが私$1のbashスクリプトの開始時に渡された引数です(sedはbashスクリプト内で実行されています)。

これは正常に実行されませんが、次のように置き換えるct_fnameと実行されます

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

ct_fname最初に合格する方法はありますか?

4

6 に答える 6

42

"一重引用符( )の代わりに二重引用符()を使用する必要があります'。一重引用符は、変数を変換(拡張)せずに、文字通りコンテンツを渡します。

試す

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

ところで、ファイルを編集する場合(つまり、file2.sasが一時ファイルの場合)、代わりにを使用する必要がありますed

于 2012-06-21T20:24:10.040 に答える
5

私の場合、一重引用符を二重引用符に置き換えました。

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

今のところ、うまく機能しています...

于 2014-07-17T10:51:57.503 に答える
3

問題は、$ct_fname置換されると、sed余分な/セパレータが表示されるため、

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

になります

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

予想される3ではなく5があるため、sedエラーが発生します。/

代わりに、sed区切り文字をまたはなどの未使用の文字に変更すると、一重引用符|または:二重引用符で問題なく機能します。

sed '24s|.*|'$ct_tname'|' file1.sas > file2.sas
sed "24s|.*|"$ct_tname"|" file1.sas > file2.sas
于 2018-02-12T15:09:09.433 に答える
2

シェル変数は一重引用符で囲まれていません。代わりにこれを試してください:

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
于 2012-06-21T20:25:51.787 に答える
1

二重()引用符を使用する必要があります"。単一(')引用符は、変数の値が置き換えられません。置換テキストに二重引用符が含まれているため、それらをエスケープする必要があります。

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
于 2012-06-21T20:25:23.640 に答える
1

他の回答は、例でエスケープされた二重引用符の使用に焦点を当てています。これは必ずしもあなたが望むものではないことに注意してください:

$ 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
于 2014-02-11T11:15:50.807 に答える