Usando o Regex Quebrando um texto no último dígito usando ferramentas do Linux como sed ou awk

4

Eu tenho a seguinte lista que eu quero quebrar no dígito. Por exemplo:

De:

103Ru
103mRh
104
1041

Para:

103
Ru
103
mRh
104
1041

Eu gostaria de usar o Regx com sed ou talvez awk para alcançar esse resultado. Mas a maioria das minhas abordagens falhou. Eu preciso de algum conselho ou possivelmente alguma solução. Obrigado

    
por AlexCon 27.03.2014 / 21:07

2 respostas

4
$ sed -r 's/([0-9])([^0-9])/\n/g' filename 
103
Ru
103
mRh
104
1041

O regex acima procura um número seguido por não um número. Se encontrado, insere uma nova linha entre eles.

Mais detalhadamente, os comandos sed do formulário s/old/new/ procuram old e substituem por new . No nosso caso, old consiste em dois caracteres: ([0-9]) corresponde a qualquer número e, por estar entre parênteses, salva o valor. ([^0-9]) corresponde a qualquer coisa que não seja um número e salva também. Esses dois caracteres, se encontrados, são substituídos por \n , o que significa a primeira correspondência (o número), uma nova linha e a segunda correspondência (não-um-número).

MORE: Se quisermos quebrar o começo dos números e ao final, adicionamos mais um comando de substituição:

$ echo xyz541wpk | sed -r 's/([0-9])([^0-9])/\n/g; s/([^0-9])([0-9])/\n/g'
xyz
541
wpk

O segundo comando de substituição é como o primeiro, mas procura pelo padrão reverso: não-um-número seguido por um número.

    
por John1024 27.03.2014 / 21:19
3

Aqui estão mais duas opções:

  1. grep

    grep -oP '\d+|.*' file
    

    Explicação:

    • -P : ativa Expressões regulares compatíveis com Perl, o que nos permite usar \d para dígitos. O símbolo | ,% lógicoOR, significa que grep irá primeiro tentar corresponder a um ou mais dígitos ( + ), e então todo o resto ( .* ).
    • -o : Isso faz com que grep imprima apenas a parte correspondente da linha de entrada. Um efeito colateral é que, se uma linha tiver várias correspondências, ela será impressa em uma nova linha, para produzir a saída desejada.
  2. Perl

    perl -lne 's/(\d+)(\D+)/$1\n$2/; print;' file
    

    Explicação:

    • O -n significa ler o arquivo linha por linha e aplicar o script fornecido por -e a cada linha. -l i) remove novas linhas ( \n ) do final da linha e ii) adiciona \n a cada print .
    • s/pattern/replacement/ : substitui pattern por replacement .
    • (\d+)(\D+) : corresponde a um ou mais dígitos ( \d ) seguidos por um ou mais não-dígitos ( \D ). Os parênteses () significam que as correspondências são capturadas para que possamos nos referir a elas como $1 e $2 .
    • Em conjunto, a substituição simplesmente inserirá uma nova linha entre uma sequência de dígitos e os seguintes não dígitos. O print apenas imprime a linha.
por terdon 28.03.2014 / 01:22

Tags