Aqui estão algumas soluções:
-
Se o seu arquivo é realmente tão simples quanto o seu exemplo, você pode fazê-lo com este script
gawk. Isso pressupõe que seu arquivo não contém nada além dedataentradas, conforme descrito na sua pergunta.gawk -F"-" '{print "<data>"$3"</data>"}' file.xml-
-F"-"diz ao gawk para considerar-como o separador de campo, o script então imprime o terceiro campo.
-
-
Para arquivos um pouco mais complexos que incluam linhas que você não deseja, isso só será impresso se os primeiros campos
($1~/data/) e último ($NF~/data/) contiveremdata:gawk -F"-" '($1~/data/ && $NF~/data/){print "<data>"$3"</data>"}' file.xml -
Se o seu arquivo puder ter muitas entradas
<data>e você se importar apenas com as que se parecem comA1-2B-C3-4D:perl -ne '/(<data>).+?-.+?-(.+?)\-.+(<\/data>)/ && do{print "$1$2$3\n"}' file.xml-nesignifica aplicar esse script a cada linha do arquivo de entrada. Em Perl (e muitas outras ferramentas), os parênteses permitem a captura de correspondências de expressões regulares. Aqui, estou capturando três padrões, as tags de abertura e fechamento ($1e$3), portanto, não preciso digitá-las duas vezes e o padrão que estamos procurando,$2.Se você precisar ser mais específico, use isso para permitir apenas caracteres alfanuméricos no primeiro campo e apenas dígitos nos outros:
perl -ne '/(<data>)[\w\d]+?-\d+?-(\d+?)\-.+(<\/data>)/ && do{print "$1$2$3\n"}' file.xml -
Isso tudo pressupõe que suas tags
<data>e</data>estejam na mesma linha. Se não estiverem, você pode fazer algo assim:perl -ne ' $d++ if /<data>/; /[\w\d]+?-\d+?-(\d+?)\-.+/ && do{ print "<data>$1</data>\n" if $d>0 }; $d-- if /<\/data>/; ' file.xml$dserá positivo se estivermos dentro de<data></data>tags. Se estivermos e encontrarmos uma linha que corresponda à expressão regular, imprima.
ATUALIZAÇÃO:
Se você deseja editar o arquivo, não apenas imprimir seu conteúdo, mas realmente alterar o arquivo original, use:
perl -i -ne 's/(<data>).+?-.+?-(.+?)\-.+(<\/data>)/$1$2$3/; print' file.xml