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

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

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

Имя пользователя=myusername
ЗашифрованныйПароль=9k3S+sS3g\=\=

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

oldusername="myusername"
oldpassword="9k3S+sS3g\=\="

новоеимяпользователя="моеновоеимяпользователя"

новыйпароль="U8djlk+h\=="

sed -i "s/$oldusername/$newusername/g" МойФайл.txt

sed -i "s/$старыйпароль/$новыйпароль/g" МойФайл.txt

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

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

Спасибо..

решение1

Глупый обходной путь, экранировать все обратные косые черты:

oldpassword="$(printf "$oldpassword" | sed 's/\\/\\\\/g')"
sed -i "s/$oldpassword/$newpassword/g" MyFile.txt

решение2

$ 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 в строках, заключенных в двойные кавычки.

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

решение3

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

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

Таким образом, матч будет провален.

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

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

Связанный контент