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:
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
diz grep
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 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, \w
não é reconhecido, a grep
menos que você use expressões regulares compatíveis com Perl . Você pode ativá-los grep
com a -P
bandeira. 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.