Sei que, usando o "-A NUM"
comutador, posso imprimir um número específico de linhas finais após cada correspondência. Só estou imaginando se é possível imprimir linhas finais até que uma palavra específica seja encontrada após cada correspondência. Por exemplo, quando eu procuro por "Palavra A", quero ver a linha que contém "Palavra A" e também as linhas após ela até a que contém "Palavra D".
contexto:
Word A
Word B
Word C
Word D
Word E
Word F
comando:
grep -A10 'Word A'
Eu preciso desta saída:
Word A
Word B
Word C
Word D
| sed -e '1d;$d'
, que é remover primeira e última linhased -n -e '/pattern A/,/pattern D/d; p'
Isto diz: "exclua do padrão A para o padrão D e imprima todo o resto". Infelizmente, este jogo é ganancioso. Isso significa que se os padrões A e D aparecerem mais de uma vez, você corresponderá do primeiro padrão A ao último padrão D. Acho que Perl ou Python são seus amigos, se for o caso.por que não usar awk?
fonte
Word D
cair na mesma linha queWord A
, e possivelmente em outro lugar, por exemplo,Word A Word D\nWord D
com o sed mostrará duas linhas, onde o awk mostrará uma. Além disso, ainda é possível usar variáveis com o awk, por exemploawk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file"
, portanto, talvez seja mais eficiente, mas ao lidar com pesquisas de duas strings que podem ou não cair na mesma linha, o awk definitivamente é mais confiável.A
eB
e você só quer capturar o que há entre cada tal sequência. parece que o sed não segue essas semânticas pelo menos no meu caso.ou
fonte
sed
isso, a menos que você precise do poder das expressões regulares do Perl para selecionar as linhas delimitadoras.