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:sedmode -
-i.bak: edição no local com.bakextension (BTW, de onde algumas implementações desedtiraram essa ideia) -
s{...}{...}ges: substitua globalmente (g), onde.corresponde também a caracteres de nova linha (s) e trate a substituição comoperlcode para executar (e). -
<string.*?>\K.*?</string>: corresponde de<string...>a</string>, mas não inclui as próprias tags na parte que é correspondida (\Kdefine 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.