У меня есть файл с именемМойФайл.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\=\=