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.