“while read” também mostra coisas que não são lidas / editadas

0

(Eu sei que o título é ruim, já que é específico para o meu caso)

Eu tenho tentado fazer um roteiro por um longo tempo agora. Eu tentei muitos métodos diferentes, mas o que eu quero fazer é editar um arquivo xml e substituir algo que está dentro de uma das tags. Este é o meu script:

while read line; do
if [[ "$line" == *"<Valuec=\"0\">"* ]]
then 
~/bin/nn4 Decrypt1 "$line" | sed 's/^/\<Valuec=\"0\"\>/g;s/$/\<\/Valuec\>/g'
fi
done <"$1"

nn4 remove as tags, descriptografa o conteúdo e o comando sed recoloca as tags.

Aqui está a entrada

<string>
    <Id>1</Id>
    <file>file.txt</file>
    <Valuec="0">982498as9adhfsdf</Valuec>
</string>
<string>
    <Id>2</Id>
    <strStringCaption>file2.txt</strStringCaption>
    <Valuec="0">2389aHASDasd</Valuec>
</string>

No entanto, isso, é claro, apenas exibe as linhas que são editadas. Parece algo assim:

<Valuec="0">decryptedstring</Valuec>
<Valuec="0">decryptedstring2</Valuec>

No entanto, quero que seja assim:

<string>
    <Id>1</Id>
    <file>file.txt</file>
    <Valuec="0">decryptedstring</Valuec>
</string>
<string>
    <Id>2</Id>
    <strStringCaption>file2.txt</strStringCaption>
    <Valuec="0">decryptedstring2</Valuec>
</string>
    
por DisplayName 07.12.2015 / 02:53

1 resposta

2

Basta adicionar uma condição else ao seu corpo de while loop:

while IFS= read -r line; do
if [[ "$line" == *"<Valuec=\"0\">"* ]]
then 
  ~/bin/nn4 Decrypt1 "$line" | sed 's/^/\<Valuec=\"0\"\>/g;s/$/\<\/Valuec\>/g'
else
  printf '%s\n' "$line"
fi
done <"$1"

Observe o uso de IFS= read -r para ler completamente uma linha .

De qualquer forma, você deve considerar usar outras ferramentas para essa tarefa. Usar o loop while no shell script é considerado uma prática ruim .

    
por 07.12.2015 / 03:04