grep falha com variável, mas funciona se a variável for soletrada

1

Eu tenho dois arquivos delimitados por vírgulas

Eu vou ler 1 linha do arquivo 1,

Eu preciso encontrar linhas correspondentes no arquivo2, incluindo a vírgula entre

Se eu fizer isso literalmente digitando a linha (ou seja, copiar-e-colar com o mouse), recebo o que preciso

Se eu atribuir a linha a uma variável, não obtenho nada

Estou perplexo. Eu sei que estou fazendo algo errado no que diz respeito à correspondência de regex, mas o que?

Aqui está um exemplo:

$ pattern=$(head -1 accts.csv)
$ echo $pattern
_ccc_net_pfx,_ccc_net_pfx_export
$ grep "$pattern" all.csv
$ grep "_ccc_net_pfx,_ccc_net_pfx_export" all.csv
MyDomain\user1,User-1,Administrator,_ccc_net_pfx,_ccc_net_pfx_export,owner,Application,,
MyDomain\user2,User-2,User,_ccc_net_pfx,_ccc_net_pfx_export,readonly,Application,,
    
por Scott 20.09.2018 / 20:10

1 resposta

1

Sua variável $pattern contém espaços - ou talvez um% espúrio^M / CR / \r no final, se accts.csv vier de uma máquina Windows.

Você não pode ver os espaços com echo $pattern , porque a variável não está entre aspas (como na chamada ao grep), e por isso é bem dividida e aparada pelo mecanismo IFS. Tente algo como echo "{$pattern}" .

Você deve aparar você mesmo:

$ pattern=$(sed 's/[ \r]//g;q' accts.csv)
    
por 20.09.2018 / 20:34