Procura arquivos por formato de correspondência de texto de um diretório Unix

0

Estou tentando pesquisar em todos os arquivos em um diretório o texto que corresponde ao padrão de qualquer diretório arbitrário. A saída deste eu espero usar para fazer uma lista de todos os diretórios referenciados nos arquivos (esta parte eu acho que posso descobrir por conta própria).

Eu observei vários recursos de regex e criei minha própria expressão que parece funcionar na ferramenta baseada em navegador, mas não no grep na linha de comando.

/\w+[(/\w+)]+

Meu entendimento até agora é que a expressão acima irá procurar o início / de um diretório e então procurar por um número indeterminado de caracteres antes de procurar por um bloco repetitivo da mesma coisa.

Qualquer orientação seria muito apreciada.

    
por BrandonKowalski 01.07.2013 / 21:51

1 resposta

1

Se eu entendi corretamente, você deseja uma regex que permita usar 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 seja repetido? Os caminhos precisam apenas de uma única barra: /etc .

De qualquer forma, se você quiser qualquer tipo de caminho (os caminhos também podem conter caracteres que não sejam palavras como { , [ , ( spaces e novas linhas etc), tente isto:

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

O -E informa a grep que o padrão que você irá fornecer deve ser interpretado como uma Expressão regular estendida em vez de seu padrão, Basic Regular Expression. EREs suportam + para "um ou mais", o que é necessário para encontrar apenas strings com pelo menos um caractere não-slash após a primeira barra.

Se você quiser encontrar apenas caminhos com mais de um único / , você pode fazer algo como

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

Os caminhos também podem terminar com uma barra se, por alguma razão, você quiser manter tais barras finais em uso ( /? significa "encontrar zero ou um / ):

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

Mais especificamente, o regex que você está usando falha por vários motivos. Em primeiro lugar, como @erewok apontou, você está usando parênteses e um + entre parênteses. Como os colchetes especificam uma classe de caracteres , qualquer item dentro deles é tratado como um dos caracteres a serem encontrados (com a exceção de de ^ , o que faz dela uma classe de caractere negada .

Portanto, [(/\w+)]+ significa encontrar% de(, / , qualquer caractere de palavra ( \w ), + ou ) uma ou mais vezes. Em qualquer caso, \w não é reconhecido por grep , a menos que você use Expressões regulares compatíveis com Perl . Você pode ativá-los em grep com o sinalizador -P . 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 pode nunca tenha certeza, usando algo menos rigoroso, minha melhor sugestão é preferível.

    
por 02.07.2013 / 04:49