Pegue o seguinte arquivo:
aaa
bbb
XXX
ccc
ddd
eee
XXX
fff
ggg
Eu gostaria de imprimir, compcregrep
, todas as linhas até a primeira contendo XXX
:
aaa
bbb
XXX
É possível (com pcregrep
ou pcre2grep
)?
Eu consegui isso:
$ pcre2grep -nM '(.|\n)*?XXX' file
1:aaa
bbb
XXX
4:ccc
ddd
eee
XXX
Existe uma maneira de sair após a primeira partida? Parece que pcre2grep
não tem uma --max-count
opção como grep
tem.
Nota : Estou ciente de que existem ferramentas melhores para obter o resultado desejado ( sed
, entre outras), mas não procuro soluções alternativas aqui. Minha dúvida é sobre pcregrep
ou pcre2grep
, gostaria de saber se existe uma forma de emular grep
a --max-count
opção do .
Como você está usando o Debian 9 (Stretch), você tem a versão
pcre2-utils
que incluipcre2grep
10.22. Essa versão não inclui a opção-m
ou--max-count
para sair após um certo número de partidas. Com isso dito, o que você está tentando fazer, imprimir em uma string, simplesmente não é possível com a versão que você possui.A versão que vem com o Debian 11 (Bullseye), 10.34, tem essa opção. Você pode usá-lo no arquivo necessário para obter a saída esperada com o seguinte:
Você também pode fazer isso com regular
grep
, pois não há necessidade de usar expressões regulares compatíveis com Perl para o seu caso:A
-n
opção não é necessária, pois apenas imprime o número da linha que não está na saída esperada e a-M
opção entra em conflito com a-m
opção porque a primeira diz para corresponder a várias linhas.Saída dos comandos acima:
Isso imprime até a primeira correspondência da string
XXX
e também as duas linhas anteriores; no entanto, eu não recomendaria isso porque você teria que saber exatamente quantas linhas aparecem desde o início da linha até a string. Isso pode não ser um problema para o seu arquivo específico, mas seria se o arquivo contivesse milhares ou milhões de linhas.O que você está tentando fazer, na verdade, é imprimir tudo desde o início do arquivo até e incluindo uma determinada string. Nenhum
grep
ou nenhum de seus derivadospcre2grep
são projetados para fazer isso e não têm opções para obter esse resultado de maneira confiável por conta própria. É por esse motivo que é melhor usar uma ferramenta realmente projetada para conseguir isso, comosed
ouawk
que mencionei anteriormente. Ambos são muito mais confiáveis e fáceis de usar para obter o que você deseja e não exigem nenhuma manipulação ou ter que saber exatamente quantas linhas vêm antes de onde você deseja que a saída pare. Você pode ter entrado nisso com a intenção de usarpcre2grep
, mas é importante reconhecer que existem opções melhores e usar uma delas.