Pergunta

Eu preciso para iterar sobre os arquivos em um diretório e executar o seguinte substituição.

Antes:

Olá $ {USER_NAME}, você vive em $ {HOME_ADDRESS}. É agora $ {TIME}

Depois:

Olá $ {username}, você vive em $ {HomeAddress}. É agora $ {time}

O número de diferentes símbolos que aparecem dentro de $ {} é grande, por isso não é realmente viável para executar:

find . -name '*' -exec sed -i 's/${USER_NAME}/${userName}/g' {} \;
find . -name '*' -exec sed -i 's/${TIME}/${time}/g' {} \;

etc.

Eu estou esperando que seja possível realizar essa substituição usando um único comando, que é algo como:

find . -name '*' -exec sed 's/XXX/YYY/g' {} \;

Mas eu não posso descobrir o que substituto para XXX e YYY. É possível fazer isso em um único comando?

Cheers, Donal

Foi útil?

Solução

A bandeira -i para sed irá editar um arquivo no local. Para XXX e YYY, você usaria algo como:

sed -i 's/USER_NAME/userName/g'

e assim por diante.

Update: Eu vejo que sua pergunta foi realmente sobre a mudança "USER_NAME" em "username" automaticamente. Você poderia tentar esse script Perl:

sub convert {
    my $r = lc $_[0];
    $r =~ s/_(.)/\U$1\E/g;
    return $r;
}
while (<>) {
    s/\${([A-Z_]+)}/\${@{[convert $1]}}/g;
    print;
}

Execute-o assim:

perl -i convert.pl inputfile.txt

Exemplo de saída:

$ cat inputfile.txt
Hello ${USER_NAME}, you live at ${HOME_ADDRESS}. It is now ${TIME}
$ perl -i convert.pl inputfile.txt
$ cat inputfile.txt
Hello ${userName}, you live at ${homeAddress}. It is now ${time}

Outras dicas

Formatada para maior clareza:

sed -i '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g 
                   s/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g 
                   s/\$\{TIME\}/\$\{time\}/g
                  }'

Onde identifica /^Hello/ as linhas que você deseja agir sobre (torná-lo mais específico, se necessário) eo resto substitui o nome de cada variável.


Se escrever isso em um script considerar o uso de um documento AQUI para manter a formatação e torná-lo mais fácil de ler e atualização ...

A resposta acima funciona muito bem. Para completar, eu poderia acrescentar que você pode fazer:

sed '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g' <filename> \
   | sed 's/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g' \
   | sed 's/\$\{TIME\}/\$\{time\}/g'

Eles são funcionalmente idênticas (exceto que mina lixeiras na saída padrão, você terá que colocá-lo em algum lugar (mas você consegue manter o original no caso, como e, você fracassar regularmente em seus regexps) eu como o meu. formulação só porque eu posso começar com o sed de comando, em seguida, adicionar mais com

!! | sed 'yet-enother-regexp'

teclas de seta? vi-mode? Quem precisa esse material? :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top