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 dedata
entradas, 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
-ne
significa 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 ($1
e$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
$d
será 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