Как использовать 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\=\= 
  • Простой, но правильный способ иметь сценарий bash отправлять вывод в журнал systemd?
  • sed специальный символ заменить не работает в сценарии оболочки
  • Можем ли мы установить пакет через сценарий оболочки?
  • как получить информацию о файлах каталога
  • Умеренные пользователи homedirs - удаление скрытых паролей
  • использовать if else в Linux, чтобы определить, существует ли папка или нет.
  • Поиск правильного dmp tmp на нескольких платформах
  • Как создать и обработать строку в оболочке Bourne FreeBSD?
  • массив сценариев оболочки для элементов файлов
  • Имена файлов сценария сценария
  • Возможно ли зацикливание
  • Interesting Posts

    Процессор является бесплатным, но скрипт bash не использует все ресурсы ЦП

    Что такое регулярное выражение для проверки пользователей Linux?

    mac terminal – как сделать каталог требует SUDO-доступа, чтобы удалить его?

    Как убить процесс, дающий ему несколько секунд, прежде чем совершить вынужденное убийство?

    Сделать символическую ссылку на относительный путь

    Чтение аудиопотоков из интернет-радио и его переключение на временный файл

    очистить tmpfs в моем случае

    Последние источники ядра недоступны для установки? (Fedora 26 Beta)

    Мышь мерцает в новой установке debian

    Запустить две установки Grub2

    Убивание фонового процесса в скрипте bash при выходе из скрипта

    Извлечение нескольких строк со вторичным поиском по ключевым словам

    Удалить пользователя ldap

    почему запросы с статусом «отказались» получают ответы?

    Команда SCP продолжает запрашивать пароль

    Linux и Unix - лучшая ОС в мире.