br comando para substituir uma linha por várias linhas sem alterar o formato do arquivo [fechado]

0

Eu tenho o arquivo xml abaixo

cat example.xml
<?xml version="1.0" encoding="UTF-8"?>
<TestConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Text>
                <Checking state="BOOT" />
                <function name="configure" type="test" username="user1" num="1" Mode="NA" Type="OPEN" txt="NA-TO" TextType="guest" who="BANANNA"/>
                <function name="configure" type="test" username="user2" num="2" Mode="YA" Type="DYNAMIC-WEP" txt="NA-TO" TextType="employee" who="BANANNA" />
                <function name="configure" type="test" username="user3" num="3" Mode="YA" Type="DYNAMIC-WEP" txt="NA-TO" TextType="employee" who="BANANNA"/>
                <function name="configure" type="test" username="user4" num="4" Mode="YA" Type="WPA2-PSK" txt="CA-TO" TextType="employee" who="BANANNA">
                        <parameters name="_key" value="password" isit="true" />
                </function>
                <function name="configure" type="test" username="user5" num="5" Mode="YA" Type="WPA2-PSK" txt="CA-TO" TextType="employee" who="BANANNA">
                        <parameters name="_key" value="password" isit="true" />
                </function>
                <function name="configure" type="test" username="user6" num="7" Mode="YA" Type="WPA2-PSK" TextType="employee" who="BANANNA">
                        <parameters name="_key" value="password" isit="true" />
                </function>
        </Text>
</TestConfig>

Neste arquivo, gostaria de alterar a linha 5 de

        <function name="configure" type="test" username="user1" num="1" Mode="NA" Type="OPEN" txt="NA-TO" TextType="guest" who="BANANNA"/>

para

        <function name="configure" type="test" username="user1" num="1" Mode="YA" Type="WPA2-PSK" txt="NA-TO" TextType="guest" who="BANANNA">
                <parameters name="_key" value="password" isit="true" />
        </function>
    
por Shravankumar Daddolu 03.01.2018 / 22:45

3 respostas

0

crie o novo arquivo newcontent.txt. colocando o conteúdo que você deseja substituir.

Cat new content.txt
<function name="configure" type="test" username="user1" num="1" Mode="YA" Type="WPA2-PSK" txt="NA-TO" TextType="guest" who="BANANNA">
                <parameters name="_key" value="password" isit="true" />
        </function>

Use o comando abaixo para obter o conteúdo substituído de acordo com sua exigência

sed '5r newcontent.txt' example2.txt  | sed ‘5d'. 

example2.txt == > arquivo de entrada original

newcontent.txt == > Consiste em conteúdo que precisa ser substituído

Saída

<?xml version="1.0" encoding="UTF-8"?>
<TestConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Text>
                <Checking state="BOOT" />
<function name="configure" type="test" username="user1" num="1" Mode="YA" Type="WPA2-PSK" txt="NA-TO" TextType="guest" who="BANANNA">
                <parameters name="_key" value="password" isit="true" />
        </function>
                <function name="configure" type="test" username="user2" num="2" Mode="YA" Type="DYNAMIC-WEP" txt="NA-TO" TextType="employee" who="BANANNA" />
                <function name="configure" type="test" username="user3" num="3" Mode="YA" Type="DYNAMIC-WEP" txt="NA-TO" TextType="employee" who="BANANNA"/>
                <function name="configure" type="test" username="user4" num="4" Mode="YA" Type="WPA2-PSK" txt="CA-TO" TextType="employee" who="BANANNA">
                        <parameters name="_key" value="password" isit="true" />
                </function>
                <function name="configure" type="test" username="user5" num="5" Mode="YA" Type="WPA2-PSK" txt="CA-TO" TextType="employee" who="BANANNA">
                        <parameters name="_key" value="password" isit="true" />
                </function>
                <function name="configure" type="test" username="user6" num="7" Mode="YA" Type="WPA2-PSK" TextType="employee" who="BANANNA">
                        <parameters name="_key" value="password" isit="true" />
                </function>
        </Text>
</TestConfig>
    
por 04.01.2018 / 04:05
1
awk 'NR!=5{print} NR==5{ print "        <function name=\"configure\" type=\"test\" username=\"user1\" num=\"1\" Mode=\"YA\" Type=\"WPA2-PSK\" txt=\"NA-TO\" TextType=\"guest\" who=\"BANANNA\">"; print "                <parameters name=\"_key\" value=\"password\" isit=\"true\" />"; print ""}' /path/to/some.xml
    
por 03.01.2018 / 23:08
1

Não use expressões regulares para analisar ou editar o XML. Ele não funciona de forma confiável e não pode ser feito para funcionar de forma confiável - mesmo se você hackear algo que "funciona", mesmo pequenas alterações ou variações inesperadas no arquivo XML de entrada podem quebrar qualquer script somente de regex.

Em vez disso, use:

  • uma linguagem de programação como perl ou python (ou muitas outras) que possuem bibliotecas de análise XML.
  • uma ferramenta de linha de comando como o xmlstarlet , que está disponível pré-empacotado para a maioria das distribuições de Linux e outros sistemas semelhantes a unix. / li>

Se você realmente precisar usar sed ou awk , use xml2 para converter os dados XML em uma linha formato orientado adequado para o processamento com tais ferramentas e, em seguida, 2xml para convertê-lo de volta para XML formatado corretamente posteriormente. por exemplo,

xml2 < yourxmlfile | your sed/awk script here | 2xml > newxmlfile
    
por 04.01.2018 / 03:33