Usando sed com uma variável:

2

Estou usando o sed para encontrar e substituir certas strings:

Caso 1. Um valor no arquivo é sempre constante. E eu quero substituir o parâmetro de falso para verdadeiro. Então eu uso este comando:

    sed -i -e 's/entry key="ignore_vc_cert" value="false"/entry key="ignore_vc_cert" value="true"/g'  /usr/local/avamar/var/mc/server_data/prefs/mcserver.xml

Isso localizará ignore_vc_cert e alterará seu valor de false para true . Funciona bem.

Em seguida, tenho outro arquivo que possui o seguinte parâmetro:

<numberOfDisk>4</numberOfDisk>

Agora, esse valor aqui pode mudar dependendo da implantação. Quero substituir o número aqui, 4 ou o que for com a saída de df -h | grep data0* | wc -l

Portanto, se a saída de df -h | grep data0* | wc -l for 3 , ela deverá substituir o valor de numberOfDisk Parâmetro de 4 a 3

Eu escrevi este comando:

sed -e s/"$(cat /usr/local/vdr/etc/vdr-configuration.xml  | grep -i numberOfDisk)"/<numberOfDisk>"$(df -h | grep data0* | wc -l)"</numberOfDisk>/g > /usr/local/vdr/etc/vdr-configuration.xml

Mas, por algum motivo, recebo numberOfDisk: No such file or directory

Se eu fizer:

sed -e 's/"$(cat /usr/local/vdr/etc/vdr-configuration.xml  | grep -i numberofdisk)"/<numberOfDisk>"$(df -h | grep data0* | wc -l)"</numberOfDisk>/g' /usr/local/vdr/etc/vdr-configuration.xml

Então eu recebo: sed: -e expression #1, char 15: unknown option to s ''

Quaisquer informações sobre como eu poderia consertar isso?

    
por suhas savkoor 04.05.2017 / 23:49

2 respostas

1

Para manipular documentos XML, use parsers / ferramentas XML.

Eu iria com xmlstarlet .

grep -c 'data0*' - produzirá o número de linhas correspondentes, não é necessário canalizar com wc -l

xmlstarlet ed -u "//numberOfDisk" -v $(df -h | grep -c 'data0*') /usr/local/vdr/etc/vdr-configuration.xml > /tmp/tmp-test.xml 
           && mv /tmp/tmp-test.xml /usr/local/vdr/etc/vdr-configuration.xml

ed - modo de edição

-u ( --update ) - atualização do documento xml

    
por 05.05.2017 / 00:14
0

Tente isso. Agarra todas as coisas antes do número existente de discos em \ 1, agarra o material depois em \ 2. Em seguida, imprime \ 1 seguido pela df ... output, seguida por \ 2.

sed -e 's/\(^.*numberOfDisk>\)[0-9]*\(<.*\)/'$(df -h | grep -c data0)'/' vdr-configuration.xml

Outra abordagem (mais curta)

sed -e '/numberOf/s/[0-9]\+/'$(df -h|grep -c data0)'/' vdr-configuration.xml
    
por 05.05.2017 / 00:06

Tags