linux - adiciona uma linha antes de terminar a linha

0

Eu quero escrever um script linux ( set_compiler.sh ) que irá adicionar uma linha antes da linha final.

O arquivo zazzercode.gwt.xml é o seguinte:

 1 <?xml version="1.0" encoding="UTF-8"?>
  2 <!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.3.0//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.3.0/distro-s    ource/core/src/gwt-module.dtd">
  3 <module rename-to="zazzercode">
  4         <inherits name="com.google.gwt.user.User"/>
  5         <inherits name="com.google.gwt.i18n.I18N" />
  6         <inherits name="com.google.gwt.http.HTTP" />
  7         <inherits name="com.google.gwt.json.JSON"/>
  8 
  9         <inherits name="com.google.gwt.uibinder.UiBinder" />
 10         <inherits name="com.google.gwt.inject.Inject" />
 11         <inherits name="com.gwtplatform.mvp.Mvp" />
 12         <inherits name="gwtquery.plugins.droppable.Droppable"/>
 13 
 14         <source path="client" />
 15         <source path="shared" />
 16 
 17         <define-configuration-property name="gin.ginjector" is-multi-valued="false"/>
 18         <set-configuration-property name="gin.ginjector" value="com.zazzercode.client.mvp.ZazzercodeGInjector"/>
 19         <set-configuration-property name="UiBinder.useSafeHtmlTemplates" value="true" />
 20 
 21         <extend-property name="locale" values="en" />
 22         <set-property name="user.agent" value="safari" />
 23         <set-property-fallback name="locale" value="en"/>
 24 
 25         <entry-point class="com.zazzercode.client.MainApp"/>
 26 
 27 </module>

Quando eu disparo o comando $ set_compiler , o script terá que adicionar a linha seguinte logo antes da linha final.

<set-property name="user.agent" value="safari" />

Algo como o código a seguir com um script.

sed -e '25a\ <set-property name="user.agent" value="safari" />' zazzercode.gwt.xml     
    
por prayagupd 05.09.2013 / 13:27

2 respostas

3

Com o seguinte conteúdo no arquivo test :

Here
are
some
lines

o seguinte comando fornece a seguinte saída:

$ NL=$(wc -l test); sed ${NL%% *}'iMYNEWLINE' test
Here
are
some
MYNEWLINE
lines

Use -i com sed se sua versão for compatível para editar o arquivo no local.

A verdadeira "mágica" é o comando sed do formulário " #itext ", onde # é um número de linha, i denota "inserir" e text é o texto a ser inserido. Aqui ele se expandirá para

sed '4iMYNEWLINE' test

Eu recebo a contagem de linha de wc . Dá saída no formulário:

$ wc -l test
4 test

mas eu só quero o número, então eu uso a expansão de chave de concha para limpar tudo que combina com o padrão * , que é "espaço e depois qualquer coisa". Essa parte é apenas uma peculiaridade do uso de wc .

Como estou escrevendo, vejo sua edição que propõe o uso de sed mais ou menos exatamente dessa maneira, então eu poderia ter salvo alguns textos, eu acho :-). No seu caso, o comando final poderia ser, por exemplo:

FN="zazzercode.gwt.xml"; NL=$(wc -l "$FN"); sed -i ${NL%% *}'i\ <set-property name="user.agent" value="safari" />' "$FN"

Observe que incluí -i : teste o comando sem ele antes de adicionar essa opção.

    
por 05.09.2013 / 14:46
1

Assumindo que seus arquivos não são enormes e você pode carregá-los com segurança na memória, você pode fazer isso evitando verificar o arquivo duas vezes (sem wc ):

perl -e 'open($fh,"$ARGV[0]"); @a=<$fh>; 
        $a[$#a-1]="<set-property name=\"user.agent\" value=\"safari\" />\n" .
            $a[$#a-1]; 
        print "@a\n";
' zazzercode.gwt.xml > new_file

Ou, para uma solução que use somente ferramentas coreutil:

$ (head -n -2 zazzercode.gwt.xml; 
  echo "<set-property name="user.agent" value="safari" />"; 
  tail -n 1 zazzercode.gwt.xml) > new_file
    
por 05.09.2013 / 15:07