Скрипт Bash, не может заменить строку в файле на экранированные $ и &

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

Пожалуйста, смотрите этот раздел для более подробного разъяснения.

Это мой файл.

test.txt

hello my root password is root.

Теперь я хочу изменить корень слова на строку. Строка может быть любой, которая может включать специальные символы, такие как $ или &.

Если я хочу заменить root на строку my&rootpa$, то она должна выглядеть как my\&rootpa\$\$ в текстовом файле.

Это мой сценарий оболочки

#!/bin/bash
dothis(){
    rootpass=$(echo "$1" | sed -r 's/\$/\\$/g');
    rootpass=$(echo "$rootpass" | sed -r 's/\&/\\&/g');
    echo $rootpass;
    sed -i "s/root/$rootpass/g" test.txt
}
dothis "my&rootpa$";

Этот скрипт работает корректно до echo $rootpass, что означает, что когда я повторю строку, он отобразит мой \ & rootpa \ $ \ $. Но в файле он выглядит как мой & rootpa $$, а не мой \ & rootpa \ $ \ $. Что не так со сценарием.

Пожалуйста, совет.

0
задан 06.05.2020, 07:48

1 ответ

Вы должны избегать $ и & несколько раз, потому что при использовании команды sed -i они также должны быть экранированы. Если их не избежать несколько раз, они будут интерпретированы как одиночные знаки & и $.

#!/bin/bash
dothis(){
    rootpass=$(echo "$1" | sed -r 's/\$/\\\\\\\$/g');
    rootpass=$(echo "$rootpass" | sed -r 's/\&/\\\\\\\&/g');
    echo $rootpass;
    sed -i "s/root/$rootpass/g" test.txt
}
dothis 'my&rootpa$';

Это сработало для меня. Вывод:

my\\\&rootpa\\\$\\\$

И тест выглядит следующим образом после выполнения:

user@host:~# cat test.txt
hello my my\&rootpa\$\$ password is my\&rootpa\$\$.
1
ответ дан 06.05.2020, 07:49

Теги

Похожие вопросы