Сед найти и заменить косой чертой

У меня возникли проблемы с использованием sed find / replace с помощью слэшей в параметре find.

Пример содержимого test.sh

str=$(sed -n '/^user:/p' /tmp/shadowtest) # find "user:" line in /etc/shadowtest arr=(${str//:/ }) # explode str with : as delimeter arr=${arr[1]} # grab the 2nd element sed -i 's|$arr|XXXXX|g' /tmp/shadowtest # Nothing gets replaced in shadowtest 

Пример содержимого / tmp / shadowtest

 # junk here user:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7::: # junk here 

Когда я запускаю скрипт как есть, ничего не заменяется в файле shadowtest. Но если я изменю команду sed на что-то вроде

 sed -i 's|99999|XXXXX|g' /tmp/shadowtest 

он отлично работает.

Если вы хотите, чтобы $ arr был заменен, вам нужно выставить его за рамки одиночных кавычек. Например:

 sed -i "s|$arr|XXXXX|g" /tmp/shadowtest 

Если я правильно понимаю цель вашего кода, то в вашем примере:

 $6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0 

следует заменить на:

 XXXXX 

Если это так, вам совсем не обязательно включать оболочку:

 sed '/^user:/s/:[^:]*/:XXXXX/ ' <<\DATA # junk here user:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7::: other:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7::: user:different stuff in this spot:16310:0:99999:7::: # junk here DATA 

ВЫВОД

 # junk here user:XXXXX:16310:0:99999:7::: other:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7::: user:XXXXX:16310:0:99999:7::: # junk here 

Он работает так же, как и ваш собственный – в основном – тем, что он обращается только к строкам, начинающимся со строки user: но вместо выполнения функции p на них он выполняет функцию s/// .

Он заменяет строку :XXXXX для первой последовательности non : символов, которым предшествует строка : on, начинающаяся со строки user: