Como imprimir uma palavra específica anterior?

3

Eu tenho um arquivo chamado city.txt , que contém as seguintes entradas.

Los Santos
San Fierro
Las Venturas

Eu quero imprimir a palavra antes de r em San Fierro , para que a saída seja assim.

San Fier

Como isso pode ser feito?

    
por muru 28.11.2016 / 10:19

4 respostas

2

Para imprimir tudo até o último r :

grep -o '^.*r' city.txt

Para imprimir tudo até o primeiro r :

grep r city.txt | grep -o '^[^r]*'

-o apenas imprime a parte correspondente de cada linha. [^r] corresponde a qualquer coisa, menos r .

Se você quiser apenas a primeira correspondência, adicione -m1 ao último grep em cada caso.

    
por choroba 28.11.2016 / 10:59
4

Para imprimir a parte anterior ao último r e imprima apenas essas linhas:

  • grep com o PCRE:

    grep -Po '.*(?=r)'
    

    .* corresponde avidamente e o padrão lookahead positivo de largura zero (?=r) garante que a correspondência seja seguida por r

  • com sed :

    sed -n 's/r[^r]*$//p'
    

    r[^r]*$ corresponde à parte do último r até o final e foi substituído por nulo.

  • com awk :

    awk '/r/ {sub("r[^r]*$", ""); print}'
    

    O mesmo que sed , /r/ garante que estamos operando apenas nas linhas que contêm r

Exemplo:

% cat file.txt                                     
Los Santos
San Fierro
Las Venturas

% grep -Po '.*(?=r)' city.txt                
San Fier
Las Ventu

% sed -n 's/r[^r]*$//p' city.txt                   
San Fier
Las Ventu

% awk '/r/ {sub("r[^r]*$", ""); print}' city.txt
San Fier
Las Ventu
    
por heemayl 28.11.2016 / 11:05
2

Mostre tudo antes de r em todas as linhas (as linhas que não contêm r serão ignoradas):

sub@debianmin:~$ grep r  city.txt | cut -f 1 -d r
San Fie
Las Ventu

Se você quiser apenas San Fie , use este comando:

sub@debianmin:~$ grep r  city.txt | cut -f 1 -d r | head -n 1
San Fie
    
por SuB 28.11.2016 / 11:49
1

No grep, usando Perl lookahead:

grep -Po '.*(?=r)'

Isso procura uma string seguida por um r , mas o r em si não é correspondido.

    
por muru 28.11.2016 / 11:03