Pesquise nos arquivos o formato de correspondência de texto de um diretório Unix

0

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.

BrandonKowalski
fonte
Seus parênteses e "+" estão dentro da classe de caracteres: "[" e "]" definem uma classe de caracteres que você está procurando; incluindo "(", ")" e "+" entre os "[]" significa que você deseja combinar esses caracteres entre outros. Eu acho que você provavelmente quer os parênteses e o "+" fora da sua classe de personagem: ([/ \ w] +). Isso deve corresponder e capturar qualquer combinação de "/" e caracteres alfanuméricos. Não postei essa resposta porque me perco tentando usar regex com grep o tempo todo.
erewok

Respostas:

1

Se eu entendi corretamente, você quer uma regex que permita que você use greppara 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:

grep -E '/[^/]+' *txt
          _____
           |  |--------> one or more
           |-----------> A character class, '^' in a character class means NOT,
                         so this class means "anything that is not /".

O -Ediz grepque 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 como

grep -E '/[^/]+/[^/]+' *txt  

Os caminhos também podem terminar com uma barra, se por algum motivo você desejar manter essas barras finais ( /?significa "encontrar zero ou um /):

grep -E '/[^/]+/[^/]+/?' *txt  

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, \wnão é reconhecido, a grepmenos que você use expressões regulares compatíveis com Perl . Você pode ativá-los grepcom a -Pbandeira. Por exemplo, isso corresponderá a um caminho como /etc:

grep -P '/\w+' *txt

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.

Terdon
fonte