Как использовать 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\=\= 
  • Как удалить \ n между выходами двух команд эха?
  • Как сделать скрипт автоматическим для самостоятельного ввода пароля?
  • Подавить имя файла с выхода sha512sum
  • Ловушка, ERR и повторение строки ошибки
  • Как удалить строку с переменным поиском с помощью команды sed
  • Программно / динамически настраивать сеанс сеанса SSH
  • Выйти из сценария, запустив вместо него другой скрипт
  • Удаление старых файлов в каталоге, кроме файлов, присутствующих в файле исключений
  • Как сгладить журналы для списка шаблонов и сделать из него отчет?
  • Как перемещать файлы с тем же именем и объединяться
  • Поместите консоль на ttyS0, если гостевая ОС загружается без головного убора
  • Linux и Unix - лучшая ОС в мире.