corresponde a todas as strings contendo apenas um caractere '/'

2

Eu tenho um arquivo muito longo contendo caminhos de arquivo, um em cada linha. Eu gostaria de recuperar uma lista de todos os diretórios listados que são apenas 1 nível de profundidade. Como tal, gostaria de extrair apenas as linhas que têm um único / nelas:

Eu quero: ./somedir
Eu não quero: ./somedir/someotherdir

Posso fazer isso com expressões grep e / ou regulares?

    
por Mala 10.05.2011 / 17:55

2 respostas

5

Claro. Isso é muito fácil:

find . | grep -P '^\./[^/]*$'

... onde obviamente o comando 'find' estou usando apenas para ilustrar o que você descreveu. O regex funciona da seguinte forma:

  • ^ e $ são âncoras especificando (respectivamente) o início & fim da linha. Todo o conteúdo deve estar entre esses dois caracteres
  • \./ é um período literal seguido por uma barra invertida literal
  • [^] é uma classe de caracteres que não permite nada depois do ^ e antes do ]
  • O * após [^/] diz para permitir zero ou mais ocorrências dessa classe de caracteres

Você também pode fazer assim:

dosomething | grep -P '^[^/]*/[^/]*$'

Isso permitirá apenas um único / na linha, em qualquer posição na linha (mesmo primeiro ou último caractere).

    
por 10.05.2011 / 18:05
1

A solução @Brians funciona, é mais genérica e não precisa de ./ no começo:

grep -P '^[^/]*/[^/]*$'

Por exemplo:

/aa/somedir
test/somedir/someotherdir
somedir/otherdir

--> somedir/otherdir
    
por 10.05.2011 / 18:09

Tags