Normalmente, se você quiser usar sed (ou perl, ou ruby) para modificar um arquivo, adicione a opção -i
. Digamos que estamos falando de uma atribuição de atributo em XML:
changeit() {
let newval="$1"
shift;
# "$@" now contains all filenames
sed -i -e 's/(XYZABC[[:space:]]*=[[:space:]]*)"([^"]*)"/"'"$newval"'";/' "$@"
}
changeit happy-happy /directory/filename1.xml
Antes de testar, por favor, faça uma cópia de backup do diretório / arquivos e faça diffs depois. sed -i
pode ser muito destrutivo.
Note que isso aplica a substituição uma vez por linha. Veja outras perguntas / respostas de uma vez por arquivo. Por várias vezes por linha, adicione g
após a última barra ( /
).
Uma explicação das regras de cotação: suponho que o XML bem formado encapsule valores de atributos entre aspas duplas. Então, estamos procurando VARNAME = "something"
. Isso funciona enquanto alguma coisa não contiver um caractere de aspas duplas com escape. Portanto, temos que manter as aspas duplas do shell e, para isso, usar aspas simples. Ao fazer isso, impedimos que a variável $newval
seja interpolada. Portanto, temos que fechar a parte citada do comando, logo antes da expansão da variável, e então expandir $newval
, que deve agora ser aspas duplas para evitar que o shell pense que os espaços incorporados iniciam um novo argumento (e, portanto, nome do arquivo) e, em seguida, retome aspas simples para que possamos substituir as aspas duplas como parte da saída do sed.