Eu tenho o XML assim:
<string name="foo-bar">"bar-bar -bar"</string>
<string name="asdf_qwe-rty" translatable="false">"Lorem ipsum"</string>
Agora, o name
atributo não pode conter -
caractere, então gostaria de substituí-lo por _
.
<string name="foo_bar">"bar-bar -bar"</string>
<string name="asdf_qwe_rty" translatable="false">"Lorem ipsum"</string>
Como posso fazer isso, de preferência com sed
?
Supondo que o documento XML esteja bem formado, você pode usar
xmlstarlet
para substituir todas as ocorrências do caractere-
nosname
atributos de todos osstring
nós_
por:(Adicionei um nó de encapsulamento
root
aqui para deixar o documento bem formado e alguns casos extras para mostrar que não afetaremos os valores do nó ou o conteúdo dos comentários).A
xmlstarlet
expressão encontrará todos os atributos relevantes usando a expressão XPath//string/@node
e aplicará uma tradução simples de cada um-
em_
cada um desses valores de atributo. A saída é gravada na saída padrão.Qualquer solução baseada em sed (ou qualquer outra coisa que não faça a análise XML adequada) estará errada em uma proporção de casos extremos. Por exemplo, a solução do @Pitel:
(a) substitui o conteúdo de coisas que se parecem com atributos de nome, mesmo que estejam em comentários ou texto, em vez de em uma tag inicial
(b) também altera o conteúdo de um atributo nomeado
firstname
oulastname
(c) falha em identificar o atributo se ele tiver espaço em branco ao redor do sinal de igual.
Portanto, pode ser adequado para uso pontual, mas não o coloque em um fluxo de trabalho de produção. Se você precisa de algo com qualidade de produção, use uma transformação XSLT. Não é difícil: