Como obter o texto entre duas palavras especificadas por seus índices?

5

Usando o awk, posso imprimir as palavras dos índices fornecidos da seguinte forma.

$ echo "The quick brown fox jumps over the lazy dog" | awk  '{print $3, $7}'
brown the

Mas também quero obter o texto entre as palavras especificadas, "brown" e "the". Então eu quero que a saída seja assim.

brown fox jumps over the

Não é necessário usar o awk especificamente, mas a indexação e a tokenização das palavras devem corresponder às do awk para manter a consistência com as outras partes no meu shell script que usam o awk.

Pensei em imprimir as palavras do primeiro índice até o último índice, mas isso não mantém os espaços em branco entre as palavras.

Para colocar isso de uma maneira complicada, mas mais precisa, quero obter o texto que começa no início de alguma palavra especificada por um índice e termina no final de outra palavra especificada por outro índice. Como posso conseguir isso (de preferência sem loops bash)?

    
por Helmyano 26.11.2016 / 14:43

2 respostas

7

Com gawk , você pode usar a função split() para determinar os campos e seus separadores:

$ echo "The quick brown fox   jumps over the lazy dog" | awk '{ split($0, a, "\s+", s); for (i = 3; i <= 7 && i <= length(a); i++) printf "%s%s", a[i], (i < 7 ? s[i] : "\n") }'
brown fox   jumps over the
    
por 26.11.2016 / 14:50
4

com perl

$ echo "The quick brown fox   jumps over the lazy dog"  | perl -F'(\h+)' -lane 'print @F[4..12]'
brown fox   jumps over the
  • -F'(\h+)' dividida em caracteres de espaço / tabulação, salva o separador também
  • print @F[4..12] imprime os índices necessários. O índice da matriz perl começa com 0 e o separador também deve ser considerado. Uma regra simples seria subtrair 1 e multiplicar por 2. Então (3-1) * 2 = 4 e (7-1) * 2 = 12
por 26.11.2016 / 16:31