Использовать переменную в команде sed
Я не могу использовать переменную в команде sed, например:
sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas
Я хочу $ct_tname
переменную, а не буквально $ct_tname
, и это то, что я продолжаю получать.
Кто-нибудь знает, как заставить это работать?
Проблема на самом деле более сложная, и я опустил некоторую информацию.
ct_fname="%let outputfile="/user/ct_"$1".csv";"
Здесь $1
- это аргумент, переданный в начале моего bash script (sed выполняется внутри bash script).
Это не работает успешно, но выполняется, если я заменил ct_fname
на
ct_fname="%let table=ct_$1;"
Есть ли способ успешно передать первый ct_fname
?
Ответы
Ответ 1
вам нужно использовать двойные кавычки ("
) вместо одиночных кавычек ('
).
одиночные кавычки передают свой контент буквально, не переводя переменные (расширение).
попробуйте
sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
btw, если вы собираетесь редактировать файл (то есть, если file2.sas является временным файлом), вы должны использовать ed
.
Ответ 2
В моем случае я просто переместил одиночные кавычки двойными:
for a in $(cat ext.cnf); do sed -n "/$a$/p" file1 >> file2; done
Пока это хорошо работает...
Ответ 3
Вам нужно использовать двойные ("
) кавычки, при этом одиночные ('
) кавычки значение переменной не заменяется. Поскольку у вас есть двойные кавычки в вашем заменяющем тексте, вам необходимо избегать их:
sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
Ответ 4
Переменные оболочки не разворачиваются внутри одинарных кавычек. Вместо этого попробуйте:
sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas
Ответ 5
Другие ответы сосредоточены на использовании экранированных двойных кавычек в их примерах. Обратите внимание, что это не всегда то, что вы хотите:
$ 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