Sed encontrar e substituir por barras

2

Estou com problemas para usar o sed find / replace com barras no parâmetro de localização.

Amostra do conteúdo de 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

Amostra de conteúdo de / tmp / shadowtest

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

Quando executo o script como está, nada é substituído no arquivo shadowtest. Mas se eu mudar o comando sed para algo como

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

funciona bem.

    
por kenster89 29.08.2014 / 17:07

2 respostas

1

Se você quiser que $ arr seja substituído, você precisa colocá-lo fora de aspas simples. Por exemplo:

sed -i "s|$arr|XXXXX|g" /tmp/shadowtest
    
por 29.08.2014 / 17:13
0

Se eu entendi o propósito do seu código corretamente, então, no seu caso de exemplo:

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

deve ser substituído por:

XXXXX

Se isso for verdade, você não precisa envolver o shell:

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

OUTPUT

# 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

Funciona da mesma maneira que o seu - principalmente -, pois trata somente das linhas que começam com a string user: , mas, em vez de executar a função p , ele executa a função s/// em vez de.

Ele substitui a string :XXXXX pela primeira seqüência de caracteres não- : imediatamente precedidos por : nas linhas que começam com a string user: .

    
por 29.08.2014 / 20:52