Use sed para recuperar a variável de um arquivo e colocá-lo em outro

1

Eu preciso usar o sed para recuperar um formulário variável dentro de um nome de arquivo. Estou atualizando um código anterior:

cat /directory/filename1.xml | sed -e "s/XYZABC/${c}/g" > /directory/filename2.xml

O valor de ${c} está em outro arquivo e será alterado a cada dia. Como faço isso com sed?

Aqui está um contexto adicional. Peço desculpas por não incluí-lo originalmente. ${c} é uma variável sqlplus usada para armazenar a contagem de uma consulta. Eu preciso recuperar essa contagem de um arquivo. Ele é salvo no arquivo como Count=[$c] , em que [$c] se torna a contagem da consulta. Eu preciso ter $c substituir XYZABC do primeiro arquivo xml e salvar os resultados em um novo arquivo xml.

ATUALIZAÇÃO: Caso alguém tenha um problema semelhante, usei o meu para usar:

rm /directory/folder/variablefilename.dat
echo $c >> /directory/folder/variablefilename.dat

d=$(grep [0-9] /directory/folder/variablefilename.dat)

sed -3 "s/ABC123/${d}/g" /directory/folder/inputfile.xml >> /directory/folder/outputfile.xml
    
por mcedave 30.12.2015 / 22:30

1 resposta

1

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.

    
por 30.12.2015 / 22:54