Estou tentando pesquisar em todos os arquivos em um diretório um texto que corresponda ao padrão de qualquer diretório arbitrário. A saída disso que espero usar para fazer uma lista de todos os diretórios referenciados nos arquivos (acho que posso descobrir por conta própria esta parte).
Eu olhei para vários recursos de regex e fiz minha própria expressão que parece funcionar na ferramenta baseada em navegador, mas não com grep na linha de comando.
/\w+[(/\w+)]+
Até agora, meu entendimento é que a expressão acima procurará o início / de um diretório e, em seguida, procurará um número indeterminado de caracteres antes de procurar um bloco repetitivo da mesma coisa.
Qualquer orientação será imensamente apreciada.
command-line
regex
grep
BrandonKowalski
fonte
fonte
Respostas:
Se eu entendi corretamente, você quer uma regex que permita que você use
grep
para identificar caminhos. Não tenho certeza do que você está tentando fazer com o regex que você postou. Por que você quer que algo se repita? Caminhos só precisa de uma única barra:/etc
.De qualquer forma, se você quiser qualquer tipo de caminho (caminhos podem também conter caracteres não-palavra, como
{
,[
,(
espaços e novas linhas etc), tente o seguinte:O
-E
dizgrep
que o padrão que você fornecerá deve ser interpretado como uma Expressão regular estendida, e não como padrão, Expressão regular básica. Os EREs suportam+
"um ou mais", o que é necessário para encontrar apenas cadeias com pelo menos um caractere não-barra após a primeira barra.Se você deseja encontrar apenas caminhos com mais de um único
/
, pode fazer algo comoOs caminhos também podem terminar com uma barra, se por algum motivo você desejar manter essas barras finais (
/?
significa "encontrar zero ou um/
):Mais especificamente, o regex que você está usando falha por vários motivos. Primeiro, como apontou o @erewok, você está usando parênteses e
+
colchetes internos. Como os colchetes especificam uma classe de caracteres , qualquer coisa dentro deles é tratada como um dos caracteres a serem encontrados (com exceção da^
qual faz com que seja uma classe de caracteres negada ).Então,
[(/\w+)]+
significa encontrar qualquer um(
,/
, qualquer caractere de palavra (\w
),+
ou)
uma ou mais vezes. Em qualquer caso,\w
não é reconhecido, agrep
menos que você use expressões regulares compatíveis com Perl . Você pode ativá-losgrep
com a-P
bandeira. Por exemplo, isso corresponderá a um caminho como/etc
:Se você sabe que seus caminhos sempre consistem em caracteres de palavras (por exemplo, az, AZ, 0-9 e
_
), você pode usar uma expressão como a acima, mas como nunca se pode ter certeza, usando algo menos rigoroso, lke my fist sugestão é preferível.fonte