Falha ao grep pelo primeiro caractere

3

Estou tentando listar todos os arquivos e selecionar apenas determinados deles. ls -1 retorna-me a lista

abc 
abcd
rm_0818-051752-753-06

depois disso, quero selecionar apenas por este critério para retornar a terceira linha, assim:

ls -1 | grep -E "^rm_.*"

mas não recebo nada.

Estou tentando reconhecer o primeiro caractere da terceira linha desta maneira:

var=$(ls -1 | grep -E "rm_")
echo $var //returns rm_0818-051752-753-06
echo ${var:0:1} //returns some strange symbol 001B in square

Você pode me explicar esse comportamento e como eu poderia usar o primeiro caractere ^? Obrigado

    
por viavad 18.08.2016 / 12:17

3 respostas

9

ls -1 | grep -E "^rm_.*" parece bom e deve funcionar. O motivo pelo qual ele não funciona é o alias vinculado ao comando ls em seu perfil.
Para garantir, tente /bin/ls -1 | grep -E "^rm_.*"

    
por 18.08.2016 / 12:26
8

Parece que você tem grep aliased para grep --color=always ou similar. Você pode verificar isso executando type grep . Posso reproduzir um comportamento semelhante:

$ var=$(ls -1 | grep --color=always "^rm")
$ echo ${var:0:1}
## Weird boxed character appears here

Para ver o que está acontecendo um pouco melhor, podemos passar $var a od :

$ echo "$var" | od -c
0000000 033   [   0   1   ;   3   1   m 033   [   K   r   m 033   [   m
0000020 033   [   K   _   0   8   1   8   -   0   5   1   7   5   2   -
0000040   7   5   3   -   0   6  \n
0000047

O 033 [ 0 1 ; 3 1 m 033 [ K é cor ANSI escapa , e é isso que está quebrando aqui. Você pode evitar isso usando uma versão não balanceada de grep :

/bin/grep '^rm_'

ou

\grep '^rm_'

Melhor ainda, não analise ls , pois isso geralmente leva a outros problemas . Uma maneira mais segura e simples de fazer o que você quer é:

$ var="rm*"
$ echo $var
rm_0818-051752-753-06
$ echo ${var:0:1}
r
    
por 18.08.2016 / 13:01
6

Por que o grep, por que não apenas:

ls -1 rm_*
    
por 18.08.2016 / 12:23

Tags