Я создал сценарий оболочки, который принимает строку в качестве входных данных. Если строка содержит «$» или «&», то мне нужно заменить эти символы на «\ $» и «\ &». Я мог сделать это с помощью команды 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 \ $ \ $. Что не так со сценарием.
Пожалуйста, совет.
Вы должны избегать $
и &
несколько раз, потому что при использовании команды 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\$\$.