Grep Pattern e a próxima palavra

1

Eu tenho um arquivo de texto com linhas como esta (apenas as duas últimas strings importam):

1 sometext Pattern
2 sometext Pattern  5Asda5}  
3 sometext Pattern asd2-asd  
4 sometext Pattern a-d
5 sometext Pattern   foobar  
6 sometext Pattern {asd  
7 Pattern Pattern something 123asd  
8 Pattern sometext asd    
9 Pattern 5h{1,2}b

Eu preciso encontrar cada linha com "Padrão" como última palavra. Uma palavra é definida nesse caso como string com letras e hífens. Pode haver espaços ou espaços à esquerda após uma string (assim: Padrão \ t \ t \ t \ t \ t $)

Minha opinião sobre isso é

egrep  '(\bPattern\b +[^a-zA-Z\-]{2,} *$)|(\bPattern\b *$)' file.txt 

para encontrar todas as linhas com Padrão seguido de espaço (s) e uma não "palavra" no final ou com Padrão no final. Mas a primeira parte não funciona como pretendido. Eu preciso de outra maneira de encontrar as não palavras.

Você poderia me mostrar um caminho para a linhagem 1, 2, 3, 6, 9, mas não o resto?  Eu gosto de ficar longe do awk, pois não cobrimos isso na aula.

    
por JDizzle 23.06.2017 / 16:01

1 resposta

1

Observe que \b , em grep implementações que o suportam, é para a transição entre um caractere de palavra (alnum e sublinhado) e um caractere não de palavra (ou vice-versa). Então, \bPattern\b corresponderia em foo-Pattern.bar , por exemplo.

Se você está procurando uma palavra em Pattern delimitada em branco, não é possível usar \b .

Aqui, parece que você está procurando por um Pattern delimitado em branco, seguido por uma lista de zero ou mais strings delimitadas em branco que possuem caracteres diferentes de letras e - , portanto:

non_word='([^[:blank:]]*[^[:blank:][:alpha:]-][^[:blank:]]*)'
grep -E "(^|[[:blank:]])Pattern([[:blank:]]+$non_word)*[[:blank:]]*$"
    
por 23.06.2017 / 16:17

Tags