Подтвердить что ты не робот

Использовать переменную в команде 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?

4b9b3361

Ответ 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