br comando não retorna o que eu quero

3

Meu documento doc.lst é composto por números e letras como esta: 01 ABC e quero levar apenas a parte "ABC". Eu tentei isso, mas ele inclui os números no meu resultado.lst.

    sed -n -e '/[A-Z][A-Z][A-Z]/p' < doc.lst > result.lst

Como excluir esses números?

    
por Julien S 10.03.2015 / 09:17

2 respostas

4
sed -n -e '/[A-Z][A-Z][A-Z]/p'

imprime as linhas que correspondem a essa expressão regular.

Aqui, você deseja:

sed -n 's/.*\([[:upper:]]\{3\}\).*//p'

Ou seja, você deseja substituir uma sequência de qualquer caractere (o maior número possível) seguido por 3 letras maiúsculas (capturadas em com \(...\) ) seguidas por uma seqüência de caracteres com as letras capturadas e impressão o resultado dessa substituição se corresponder (o sinalizador p do comando s ).

Note que apenas imprimirá um conjunto por linha (o mais à direita).

Para imprimir todos eles, você poderia fazer:

tr -cs '[:upper:]' '[\n*]' | grep -Ex '.{3}'

(observe que, com algumas implementações de tr , ele não funciona corretamente com caracteres de múltiplos bytes).

A idéia é de tr analisar as s equações do c omplemento de letras de maiúsculas superiores para caracteres de nova linha , de modo que a saída de tr contenha todas as seqüências de caracteres maiúsculos. Então você pode fazer um x ato grep para os que você está interessado.

Em uma entrada como FOO BAR02 ABCDEF , seria impresso:

FOO
BAR

Enquanto a solução anterior imprime DEF . Se você tem o GNU grep , você pode usar sua opção -o :

grep -Eo '[[:upper:]]{3}'

Qual imprimiria:

FOO
BAR
ABC
DEF
    
por 10.03.2015 / 09:26
1

Para uma lista como ...

01ABC
03BHG
2TG

... você pode fazer várias coisas.

Talvez seja mais simples:

sed 's/[^[:upper:]]\{1,\}/\n/g;/^\n/D'

... que substituiria apenas qualquer sequência de caracteres que não fosse uma letra maiúscula para \n ewline, e evitaria imprimir quaisquer resultados que depois começassem com \n ewline (embora se maiúsculas cartas permanecem, elas ainda serão impressas) .

Se você tiver números seguindo as letras maiúsculas que deseja manter, tente:

sed -n '/[[:upper:]]/s/[^[:upper:]]*//p'

... o que removeria todas as letras não maiúsculas da cabeça de uma linha que definitivamente contém um caractere maiúsculo e imprime os resultados. Isso só funcionará para um conjunto por linha, mas baseado em seu comentário - acho que é tudo o que você tem?

    
por 10.03.2015 / 14:30

Tags