Например:- У меня есть файл с именем file.txt

$ cat file.txt
$key

У меня есть переменная окружения, например: $ key в текстовом файле

и скажем, $ key = 1234, так что я могу заменить значение с помощью команды ниже

sed -i 's/$key/'"$key"'/' file.txt 

и это становится

$ cat file.txt
1234

Моя проблема в том, что если значение для

$key = 1/2/3/4

Я не могу запустить приведенную ниже команду

sed -i 's/$key/'"$key"'/' file.txt  

Это даст ошибку

sed: bad option in substitution expression

Из-за косой черты он ломается. Я могу решить это, указав значение напрямую, но я не хочу использовать его таким образом.

sed -i 's/$key/1\/2\/3\/4/' file.txt 

2 ответа2

5

Проблема связана с тем фактом, что разделитель sed является / и он сталкивается с текстом в $key . Чтобы решить эту проблему, используйте другой разделитель. Например, #:

$ key="1/2/3/4"
$ echo 1/2/3/4 | sed "s#$key#\"$key\"#" 
"1/2/3/4"

Или же

$ echo "hello this is 1/2/3/4 yeah" | sed "s#$key#\"$key\"#"
hello this is "1/2/3/4" yeah

Интересное чтение: какие разделители вы можете использовать в sed? , Спойлер: почти все!

1

Perl на помощь:

perl -pe 's/\$([[:alnum:]]+)/$ENV{$1}/'

Объяснение:

  • \$ соответствует знаку доллара.
  • [[:alnum:]] соответствует цифрам, буквам и подчеркиванию, то есть допустимым символам идентификатора. Знак + означает, что должен быть хотя бы один такой символ.
  • (...) вводит группу захвата.
  • $ENV{$1} извлекает значение из хеша %ENV который содержит переменные среды. Perl не раскрывает переменные, такие как shell, поэтому переменная может содержать / (или что-либо еще) без вреда.

Пример:

$ echo '$key' | key=1/2/3/4 perl -pe 's/\$([[:alnum:]]*)/$ENV{$1}/'
1/2/3/4

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .