Как использовать sed для замены строк, в которых есть «\»?

У меня есть файл с именем MyFile.txt со следующим содержимым:

Имя пользователя = MyUserName
EncryptedPassword = 9k3S + sS3g \ = \ =

Каждый раз, когда мне нужно изменить имя пользователя и пароль, я запускаю сценарий оболочки. В сценарии оболочки я сохраняю имя пользователя и пароль для двух переменных, а именно:

oldusername = "MyUserName"
OldPassword = "9k3S + sS3g \ = \ ="

newusername = "mynewusername"

Новый_пароль = "U8djlk + Н \ =="

sed -i "s / $ oldusername / $ newusername / g" MyFile.txt

sed -i "s / $ oldpassword / $ newpassword / g" MyFile.txt

Первое sed работает правильно и заменяет имя пользователя, однако вторая команда sed не работает и пароль не изменяется в файле. Я думаю, что это из-за символа «\», присутствующего в переменных.

Может ли кто-нибудь помочь мне с этим и дать мне знать, как это сделать?

Благодаря..

3 Solutions collect form web for “Как использовать sed для замены строк, в которых есть «\»?”

Глубокое обходное решение, избежание всех обратных косых черт:

 oldpassword="$(printf "$oldpassword" | sed 's/\\/\\\\/g')" sed -i "s/$oldpassword/$newpassword/g" MyFile.txt 
 $ cat MyFile.txt Username=myusername EncryptedPassword=9k3S+sS3g\=\= $ oldusername="myusername" $ oldpassword="9k3S+sS3g\=\=" $ newusername="mynewusername" $ newpassword="U8djlk+h\==" $ perl -pe "s/\Q$oldusername/q($newusername)/e ; s/\Q$oldpassword/q($newpassword)/e" MyFile.txt Username=mynewusername EncryptedPassword=U8djlk+h\== 

Из perldoc для \Q и q()

Возвращает значение EXPR со всеми символами без слова «ASCII». (То есть всем символам ASCII, не соответствующим / [A-Za-z_0-9] /, будет предшествовать обратная косая черта в возвращаемой строке, независимо от любых настроек языкового стандарта.) Это внутренняя функция, реализующая реализацию \ Q escape в двойном -конированные строки

Как только результат будет в порядке, используйте perl -i -pe для редактирования perl -i -pe , так же, как sed

Вы эхолотировали содержимое $ oldpassword? Обратные косые черты будут отсутствовать в $ oldpassword,

 $ oldpassword=9k3S+sS3g\=\= $ echo $oldpassword 9k3S+sS3g== 

Таким образом, матч не удастся.

Если вы хотите использовать символы обратной косой черты, поместите одинарные кавычки вокруг значения, которое вы назначаете oldpassword, чтобы остановить интерпретацию оболочки как escape-последовательности, то есть сделать значение буквенной строкой,

 $ oldpassword='9k3S+sS3g\=\= 
  • передавать файл в удаленный каталог только в том случае, если он не существует без замены
  • Как получить возвращаемое значение из функции MATLAB
  • Запись вывода команды в файл в сценарии bash
  • Есть ли способ, использующий скрипт bash, чтобы получить местоположение изменений, сделанных в последнем git-коммите?
  • Запуск smartctl на всех дисках сервера
  • Как я могу обнаружить оболочку без входа? (В Zsh)
  • Строки префикса и суффикса для каждой выходной строки из команды
  • Имя файла, начинающееся с - (тире)
  • Передача параметра одиночной кавычки
  • Переменные доступа, установленные внутри подстановок
  • Bash не может запустить команду из скрипта: команда mkdir не найдена
  • Linux и Unix - лучшая ОС в мире.