Если я запускаю эти команды из скрипта:
#my.sh
PWD=bla
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
xxx
bla
это нормально.
Но если я бегу:
#my.sh
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
$ sed: -e expression #1, char 8: Unknown option to `s'
Я прочитал в уроках, что для замены переменных окружения из оболочки вам нужно остановить и «заключить в кавычки» $varname
часть, чтобы она не заменялась напрямую, что я и сделал, и это работает только в том случае, если переменная определена непосредственно перед этим.
Как я могу заставить sed распознавать $var
переменную окружения, как она определена в оболочке?
set -x
в оболочке, чтобы оболочка отображала каждую команду непосредственно перед ее выполнением. Это может устранить много путаницы. (Кроме того, я часто использую,set -u
чтобы сделатьset -e
Ответы:
Ваши два примера выглядят одинаково, что затрудняет диагностику проблем. Потенциальные проблемы:
Вам могут понадобиться двойные кавычки, как в
sed 's/xxx/'"$PWD"'/'
$PWD
может содержать косую черту, в этом случае вам нужно найти символ, который не содержится в нем,$PWD
чтобы использовать его в качестве разделителя.Возможно, чтобы решить обе проблемы одновременно
источник
В дополнение к ответу Нормана Рэмси я хотел бы добавить, что вы можете заключить в кавычки всю строку (что может сделать оператор более читабельным и менее подверженным ошибкам).
Так что если вы хотите найти 'foo' и заменить его содержимым $ BAR, вы можете заключить команду sed в двойные кавычки.
В первом случае $ BAR не будет правильно расширяться, а во втором $ BAR будет расширяться правильно.
источник
"2,$s/^/$foo/"
как$s
получает истолкована как переменные тоже , и он не должен.Вы можете использовать другие символы, кроме "/", в подстановке:
источник
sed
было недоразумением из-за интерпретации/
в $ 2. Это было именно то, что мне нужно, чтобы пройти через это. Спасибо за отличный совет!Еще одна простая альтернатива:
Поскольку
$PWD
обычно содержит косую черту/
,|
вместо/
оператора sed используйте вместо :источник
$PWD
...?С редактированием вашего вопроса я вижу вашу проблему. Допустим, текущий каталог
/home/yourname
... в данном случае ваша команда ниже:будет расширен до
который не действителен. Вы должны поместить
\
символ перед каждым/
в вашем $ PWD, если вы хотите сделать это.источник
плохой способ: изменить разделитель
может быть, это не окончательный ответ,
Вы не можете известно , какой символ будет происходить
$PWD
,/
:
OR@
.хороший способ - заменить специальный символ в
$PWD
.хороший способ: экранирующий символ
например: попробуйте заменить
URL
как $ url (имеет:
/
в содержании)в строке $ tmp
а. использовать в
/
качестве разделителяИЛИ
б. использовать в
:
качестве разделителя (более читабельно, чем/
)источник
На самом деле, самая простая вещь (по крайней мере в gnu sed) - это использовать другой разделитель для команды sed substitution (s). Поэтому вместо того, чтобы s / pattern / '$ mypath' / был расширен до s / pattern // my / path /, что, конечно же, запутает команду s, используйте s! Pattern! '$ Mypath'! который будет расширен до s! pattern! / my / path! Я использовал символ взрыва (!) (Или используйте все, что вам нравится), который избегает обычной косой черты «только из-за вашего выбора» в качестве разделителя.
источник
где VAR содержит то, что вы хотите заменить поле
источник
Работа с переменными в Сед
источник
У меня была похожая проблема, у меня был список, и мне нужно построить сценарий SQL на основе шаблона (который содержался
@INPUT@
как элемент для замены):источник