Com um recente (para \K
e s///r
) perl
e supondo que suas tags <string>
não aninhem:
perl -0777 -pi.bak -e's{<string.*?>\K.*?(?=</string>)}{$&=~s/-/–/rg}ges' file.xml
-
-0777
: modo slurp : manipula o arquivo inteiro de uma só vez (para permitir que<string>
tags ocupem várias linhas). -
-p
:sed
mode -
-i.bak
: edição no local com.bak
extension (BTW, de onde algumas implementações desed
tiraram essa ideia) -
s{...}{...}ges
: substitua globalmente (g
), onde.
corresponde também a caracteres de nova linha (s
) e trate a substituição comoperl
code para executar (e
). -
<string.*?>\K.*?</string>
: corresponde de<string...>
a</string>
, mas não inclui as próprias tags na parte que é correspondida (\K
define onde a porção correspondida começa, e(?=...)
é um operador de look-ahead que somente verifica se</string>
está lá, mas não o inclui no jogo). -
%código%. Faça a substituição na parte correspondida (
$&=~s/.../.../rg
). O sinal$&
é, na verdade, não modificarr
, mas retornar a string substituída.