ant sed não pode ser inserido se um arquivo terminar com uma linha vazia

0

Eu tenho um arquivo uca.xml (configuração do Thunar para ações personalizadas):

<?xml encoding="UTF-8" version="1.0"?>
<actions>
<action>
    <!--some code-->
</action>
</actions>
<--blank line here-->

Lembre-se de que o arquivo termina com uma linha em branco

Eu quero um comando bash / script para inserir um arquivo customAction.txt contendo:

<action>
    <!--custom configuration-->
</action>

então terminará como:

<?xml encoding="UTF-8" version="1.0"?>
<actions>
<action>
    <!--some code-->
</action>
<action>
    <!--custom configuration-->
</action>
</actions>

Eu tentei um método dado por jfgagne :

sed -n -i -e '/<\/actions>/r customAction.txt' -e 1x -e '2,${x;p}' -e '${x;p}' uca.xml

mas funciona apenas se houver pelo menos um caractere (não uma linha em branco) inserido abaixo da tag .

Minha solução temporária é um script:

echo "someDummyText" >> uca.xml
sed -n -i -e '/<\/actions>/r customaction.txt' -e 1x -e '2,${x;p}' -e '${x;p}' uca.xml
sed -i 's/someDummyText//' uca.xml
sed -i '${/^$/d;}' uca.xml

mas acredito que exista uma solução mais elegante, de uma linha, com sed. Agradecemos antecipadamente.

Nota: este é o meu post para a comunidade U & L e StackExchange, então seja gentil comigo e não hesite em me corrigir se eu fizer algo errado. Eu li o FAQ do SE e tentei procurar uma resposta em outro lugar sem muita sorte.

    
por mDfRg 31.03.2016 / 12:27

2 respostas

0

Acho que sua solução é perfeitamente adequada. Você pode otimizá-lo um pouco, substituindo os últimos 2 seds com apenas um:

sed -i '$d' uca.xml

Afinal, você acabou de colocar a linha extra lá, então você sabe o que está removendo.

Se você está procurando soluções alternativas, você pode usar sed para obter o número da linha da correspondência de padrões e, em seguida, usar -1 para fazer a leitura:

if lno=$(sed -n -e '/<\/actions>/=' uca.xml)
then let lno=lno-1
     sed  -i -e "$lno"'r customaction.txt' uca.xml
fi

ou se você gosta do comando ed antigo mas que pode ser reparado, você pode fazer

ed -s uca.xml <<\!
?</actions>
-1r customaction.txt
w
q
!
    
por 31.03.2016 / 14:40
0

Usando o comando sed read ( r ):

$ sed '\#</action>#r customAction.txt' uca.txt
<?xml encoding="UTF-8" version="1.0"?>
<actions>
<action>
    <!--some code-->
</action>
<action>
    <!--custom configuration-->
</action>
</actions>

Há uma linha em branco no final do arquivo de entrada, e isso é preservado na saída. O comando r irá inserir o conteúdo do arquivo fornecido depois de encontrar o padrão fornecido. Isso funciona como esperado nos dados de exemplo, porque a única ocorrência da string </action> . Se houvesse mais ações pré-existentes no arquivo de entrada, isso não funcionaria como esperado.

O seguinte funcionaria em um arquivo contendo várias ações:

gsed -e '\#</actions>#d' -e '$ r customAction.txt' -e '$ a\</actions>' uca.txt

Remove a tag </actions> quando encontrada e insere o conteúdo de customAction.txt no final. Em seguida, ele anexa </actions> depois disso.

Esta forma de escrever o comando a requer o GNU sed (daí gsed ).

    
por 21.09.2017 / 10:19