Grep para regex no basename mas retorna wholename

0

digamos que eu tenha uma lista de arquivos em um arquivo de texto:

...
/foo/barfoo
/bar/foo/foobar
/foobar/bar/foo
...

Eu tenho um script que pesquisará esse arquivo de texto e, assim como o comando locate, desejo pesquisar o nome de base do arquivo. Até agora eu usei este comando grep grep -E */.*${1}[^/]*$ , que funciona bem, a menos que eu queira grep para um regex. Então, no exemplo acima, se eu quisesse encontrar arquivos começando com "foo", eu executaria myscript --basename ^foo , mas isso falha porque a regex inteira se torna grep -E */.*^foo[^/]*$ , o que obviamente falharia. Pensei em usar o xargs para conectar cada entrada ao basename, mas eu preciso que o script coloque todo o caminho do arquivo no final.

Alguma ideia? Eu preferiria a conformidade com POSIX, mas os GNUisms também são bons

    
por user120161 19.06.2015 / 19:44

2 respostas

1

Se foo tiver que coincidir no início do nome da base:

< inputfile grep '/foo[^/]*$'
  • /foo[^/]*$ : corresponde a uma string /foo seguida por qualquer número de qualquer caractere que não seja / no final da string

se foo puder corresponder em qualquer lugar no nome da base:

< inputfile grep 'foo[^/]*$'
  • foo[^/]*$ : corresponde a uma string foo seguida por qualquer número de qualquer caractere que não seja / no final da string
por 19.06.2015 / 19:53
0

Se o seu grep suporta PCRE (expressões regulares compatíveis com Perl):

$ grep -Po '.*/\Kfoo[^/]*$' file.txt 
foobar
foo
  • .*/ corresponderá até o último / e \K descartará a correspondência

  • foo[^/]*$ encontrará os nomes dos arquivos que começam com foo

por 19.06.2015 / 20:38