Extraindo um texto para trás de um caractere selecionado

0

Eu tenho um arquivo com as seguintes linhas:

handleNewConnection:: User [email protected] has 2 active nodes
handleNewConnection:: User [email protected] has 2 active nodes
handleNewConnection:: User [email protected] has 2 active nodes
handleNewConnection:: User [email protected] has 2 active nodes

O sistema tem que procurar por "@" (caractere selecionado) e, em seguida, extrair a seqüência de caracteres para trás o sinal "@". Como você percebe, ele pode conter caracteres numéricos ou alfabéticos e o comprimento não é constante.

com grep -o '[^"]@' /tmp/has2.txt

Eu recebo:

m@
2@
1@
g@

1) Alguém sabe se é possível obter um segundo arquivo de texto assim?

langfordm
bas102
bah001
mattleg

2) Alguém sabe se eu posso usar os nomes gerados em 1) individualmente como uma entrada para outro processo?

    
por arexturicum 29.03.2016 / 15:07

4 respostas

1

Usando grep com PCRE ( -P ):

$ grep -Po '.*\s\K[^@]+(?=@)' file.txt
langfordm
bas102
bah001
mattleg

Ou com o GNU sed :

$ sed -r 's/.*\s([^@]+)@.*//' file.txt 
langfordm
bas102
bah001
mattleg

Você pode obviamente usar o resultado em outro processo, isso depende de como o próximo processo recebe entrada. Dependendo disso, você pode criar uma matriz ou passar o resultado diretamente no STDIN do próximo processo.

    
por 29.03.2016 / 15:16
0

É muito fácil com a opção P erl compatible:

grep -Po '\w+(?=@)' file

onde \w corresponde a qualquer caractere de palavra, e (?=...) é assim chamado olhar adiante regexp.

Saída:

langfordm
bas102
bah001
mattleg
    
por 29.03.2016 / 15:18
0

Existem algumas abordagens. O mais fácil é usar essa correspondência de padrão de expressão regular

grep -io '[a-z0-9_.]*@[a-z0-9_.]*'

Isso corresponderá e imprimirá a string mais longa que contém

  • Zero ou mais ( * ) de caracteres sem distinção entre maiúsculas e minúsculas nos intervalos a-z ou 0-9 ou _ ou .
  • precisamente um @
  • Zero ou mais ( * ) de caracteres sem distinção entre maiúsculas e minúsculas nos intervalos a-z ou 0-9 ou _ ou .

E, em seguida, divida a parte @domain

cut -d@ -f1

Assim, a linha completa seria

grep -io '[a-z0-9_.]*@[a-z0-9_.]*' /tmp/file.txt | cut -d@ -f1

A outra abordagem é usar um PCRE de look-ahead que permite que grep imprima a parte de nome de usuário de seu padrão username@domain em uma etapa. Isso é muito mais difícil de acertar, mas elimina a necessidade do cut no exemplo acima

grep -Pio '\S+(?=@\S+)'

Isso significa

  • Corresponde a um ou mais caracteres ( + ) não espaciais ( \S )
  • São seguidos pelo padrão @ e um ou mais caracteres ( + ) não espaciais ( \S )
por 29.03.2016 / 15:15
0

Com qualquer versão de sed , usando expressões regulares básicas:

sed -e 's/.* \([^@]\+\)@.*//' /tmp/has2.txt

Quanto à sua segunda pergunta, você pode sempre usar dados digitados ou extraídos ou gerados de qualquer maneira como entrada para outro processo, desde que:

  1. está em um formato com o qual o outro processo pode trabalhar (ou pode ser transformado nesse formato com sed , awk , perl e / ou outras ferramentas usuais)

  2. o outro processo é capaz de receber entradas de stdin ou de um arquivo ou arquivos arbitrários - ou seja, não é codificado para receber sua entrada apenas de um arquivo específico em um local específico .... e, mesmo assim, se você criar / substituir esse arquivo específico para que ele contenha seus dados ainda funcionará.

Esta é a beleza do unix e da abordagem de pequenas ferramentas - ele incentiva você a pensar de uma maneira centrada em dados (onde os dados são seus para fazer o que você quer com, usando as ferramentas de sua escolha incluindo custom-written ferramentas) em vez de uma forma centrada no aplicativo (em que os dados pertencem ao aplicativo de caixa preta mágica e você só pode manipular ou interagir com os dados por meio desse aplicativo em particular).

Tão importante quanto isso, incentiva os desenvolvedores, inclusive os desenvolvedores de aplicativos, a pensar da mesma maneira centrada em dados. E os usuários podem pensar nisso como um bug e uma violação de seus direitos quando os desenvolvedores de aplicativos frustram suas necessidades ao tentar bloquear os dados dos usuários em seus aplicativos.

    
por 30.03.2016 / 03:37

Tags