Substituir o valor de um atributo XML pelo valor de uma variável de shell

0
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE POWERMART SYSTEM "powrmart.dtd">
<POWERMART CREATION_DATE="12/01/2016 17:43:15" REPOSITORY_VERSION="184.93">
<REPOSITORY NAME="PCREPO_BIDEV" VERSION="184" CODEPAGE="UTF-8" 
DATABASETYPE="Oracle">
<FOLDER NAME="ABC" GROUP="" OWNER="Administrator" SHARED="SHARED" 
DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="3b13d2c9-39dc-426f-8320- 
def2bb8424ef">

Eu tenho os dados da amostra acima. Em qual arquivo terá NOME DA PASTA com algum valor. Eu tenho que substituí-lo com algum outro valor que é uma variável Quero substituir FOLDER NAME="ABC" por DEF

 sed -i "s/<FOLDER NAME=\"\*\"/<FOLDER NAME=\"$FLDR\"/g" Gather.XML

Os comandos acima de sed não aparecem em nenhum erro, mas não estão sendo substituídos.

    
por user_297020 26.06.2018 / 09:22

4 respostas

0

Tente isso,

sed -i 's/<FOLDER NAME="[A-Z]*"/<FOLDER NAME="'$FLDR'"/g' Gather.XM
    
por 26.06.2018 / 09:58
2

Assumindo que este é um documento XML bem formado, usando XMLStarlet :

xmlstarlet ed -u '/POWERMART/REPOSITORY/FOLDER[@NAME="ABC"]/@NAME' -v "$FLDR" file.xml

Isso localizaria o nó FOLDER sob /POWERMART/REPOSITORY cujo atributo NAME é ABC e alteraria seu valor para o valor da variável FLDR da shell.

Exemplo:

$ cat file.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE POWERMART SYSTEM "powrmart.dtd">
<POWERMART CREATION_DATE="12/01/2016 17:43:15" REPOSITORY_VERSION="184.93">
  <REPOSITORY NAME="PCREPO_BIDEV" VERSION="184" CODEPAGE="UTF-8" DATABASETYPE="Oracle">
    <FOLDER NAME="ABC" GROUP="" OWNER="Administrator" SHARED="SHARED" DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="3b13d2c9-39dc-426f-8320-def2bb8424ef"/>
  </REPOSITORY>
</POWERMART>

$ FLDR='DEF'
$ xmlstarlet ed -u '/POWERMART/REPOSITORY/FOLDER[@NAME="ABC"]/@NAME' -v "$FLDR" file.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE POWERMART SYSTEM "powrmart.dtd">
<POWERMART CREATION_DATE="12/01/2016 17:43:15" REPOSITORY_VERSION="184.93">
  <REPOSITORY NAME="PCREPO_BIDEV" VERSION="184" CODEPAGE="UTF-8" DATABASETYPE="Oracle">
    <FOLDER NAME="DEF" GROUP="" OWNER="Administrator" SHARED="SHARED" DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="3b13d2c9-39dc-426f-8320-def2bb8424ef"/>
  </REPOSITORY>
</POWERMART>

Se você tiver que corresponder a REPOSITORY de NAME , então, por exemplo,

xmlstarlet ed -u '/POWERMART/REPOSITORY[@NAME="PCREPO_BIDEV"]/FOLDER[@NAME="ABC"]/@NAME' -v "$FLDR" file.xml
    
por 26.06.2018 / 12:10
0

Está a perder um " . " na sua expressão sed para corresponder a todos os caracteres

 sed -i "s/<FOLDER NAME=\"\.*\"/<FOLDER NAME=\"$FLDR\"/g" Gather.XML
    
por 26.06.2018 / 09:26
0

Parece que você deve fazer [^\"]* em vez de \* :

sed -i "s/<FOLDER NAME=\"[\"]*\"/<FOLDER NAME=\"$FLDR\"/g" Gather.XML

Desde que você deseja corresponder todo o texto até o primeiro " lá. \* corresponderá ao caractere literal * , mas você não tem isso aí, portanto, o conteúdo do arquivo nunca corresponde.

    
por 26.06.2018 / 09:27