Como inserir uma nova linha para cada ocorrência da palavra abstract_ usando BATCH

0

Eu tenho um xml que preciso editar usando o lote. Como você insere uma nova linha para cada ocorrência da palavra abstract _ em todo o arquivo?

Aqui está uma linha no xml (9999999x.xml)

<related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999999_abstract_ddd.jpg"/><related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999988_abstract_ddd.jpg"/><related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999977_abstract_ddd.jpg"/><related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999966_abstract_ddd.jpg"/>

O que eu queria que parecesse ...

<related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999999_abstract_
ddd.jpg"/><related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999988_abstract_
ded.jpg"/><related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999977_abstract_
dfd.jpg"/><related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999966_abstract_
dgd.jpg"/>

Ele não precisa substituir o arquivo, ele só precisa ser salvo em outro arquivo temporário ou de texto.

Obrigado!

    
por greyMatter 13.07.2015 / 07:03

2 respostas

0

Eu vi um híbrido de lote e javascript, onde parece um lote, mas é realmente javascript em execução. jrepl.bat por Dave Benham link

Ou um programa de terceiros como perl ou sed. O jcop mostra novamente. Sed é velho, hoje em dia as pessoas usam perl. Este link mostra como converter uma pesquisa e substituir linha sed, em perl Perl para correspondência com expressões regulares no Terminal? Mas não há problema em usar sed. Sed trabalha linha por linha, então não suporta \ n na seção de localização (mesmo a versão 'mais recente' não funciona). Mas o sed (além de uma versão antiga no unxutils) suporta na seção de substituição, que é o que você precisa. Perl, claro, o ajuda a encontrar ou substituir.

Você pode obter sed no gnuwin32 link baixar sed lá e, se fizer isso, Eu sugiro começar gnuwin32 coreutils também, e quaisquer outros que você achar que você quer.

Existe uma versão antiga do sed de unxutils, embora eu não sugira isso, e a versão antiga do sed que o unxutils possui é a versão 3.02 do GNU sed que não suporta \ n, portanto, não ajudará. Há também um sed no Windows SUA, mas esse não suporta \ n e nem sequer diz qual versão ele é.

Portanto, obtenha sed do gnuwin32 ou cygwin ou MinGW ou gow. Não SUA e não unxutils.

    
por 13.07.2015 / 08:08
0
sed 's/abstract_/abstract_\n/g' 9999999x.xml > 9999999xa.xml

sed é um editor unix estranho que poucas pessoas usam, exceto para fazer edição em linha. Ele vem instalado em todas as distribuições.

Nesse caso, ele pega o arquivo de entrada e, em seguida, aplica o comando entre aspas, o que indica ao editor para substituir abstract_ por abstract_\n . O g diz ao sed para fazer o arquivo inteiro.

Digite o resultado em stdout , que é redirecionado aqui para 9999999xa.xml . Não redirecione para o mesmo arquivo da entrada, pois isso pode causar resultados imprevisíveis.

Edit: Somos todos tão viciados em editor de tela, onde o texto é exibido e você se movimenta e edita o que deseja.

sed é diferente - você precisa saber de antemão quais comandos você aplicará ao arquivo e gravá-los em um arquivo 'script' ou incluir os comandos na própria linha de comando. Então, sed aplicará esses comandos de maneira (principalmente) linha a linha ao arquivo de entrada.

O título "editor de linha" provavelmente foi ganho pelo fato de você poder inserir sed em uma linha de comando e usar o redirecionamento para torná-lo parte do processo ... Um exemplo (que pode ser otimizado) :

cat some.txt | sed 's/abstract_/abstract_\n/g' | sort

Assim, o texto flui de cat , passando por sed , para sort , que é chamado de pipeline. sed é às vezes chamado de editor de fluxo também, pelo mesmo motivo. Dê uma olhada em a introdução do manual do sed .

    
por 13.07.2015 / 07:39