Если вы хотите, чтобы $arr был подставлен, вы должны поставить его вне одиночных кавычек. For instance:
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
на первую последовательность символов, отличных от :
, перед которой непосредственно предшествует :
в строках, начинающихся со строки ] пользователь:
.