2

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

Но в файле он выглядит как my&rootpa$$ а не my\&rootpa\$\$ . Что не так со сценарием?

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

3 ответа3

2

Не хватает дополнительного слоя цитирования. В sed & имеет особое значение при замене (обозначает совпадающую строку). Таким образом, чтобы вставить литерал & вы бы избежали его один раз, а чтобы вставить литерал \& , вы должны экранировать обратную косую черту (\\) и амперсанд (\\&), то же самое для обратной косой черты перед $ . Это дает вам:

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

Вы должны изменить эту строку:

dothis "my&rootpa$$";

в

dothis "my&rootpa\$\$";

или используя кавычки вместо двойных кавычек:

dothis 'my&rootpa$$';

В вашем случае $$ в строке my&rootpa$$ будет расширен до PID самого скрипта.

0

Это " dothis "my&rootpa$$" использует двойные кавычки, и в конце" $$ "будет расширен до текущего PID. Когда я выполняю ваш скрипт, это происходит:

 $ ./a.sh 
 my\&rootpa3595

... так как "3595" является PID сценария. Когда вы используете одинарные кавычки (''), вы ожидаете строку, которую вы ожидали:

 $ tail -1 a.sh 
 dothis 'my&rootpa$$';

 $ ./a.sh 
 my\&rootpa\$\$

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .