Funciona na linha de comando, mas não no shell script

2

Eu tenho um arquivo formatado como abaixo:

436541,000454056,Smith,john,jsmith,[email protected]

Eu quero extrair ", jsmith" e gravá-lo em outro arquivo "test.txt".

Então eu uso:

grep -o '\,[a-z][a-z0-9]{1,7}' source.txt > test.txt

da linha de comando e funciona bem.

quando eu usá-lo de um script de shell, o arquivo test.txt está vazio

#!/bin/bash
grep -o '\,[a-z][a-z0-9]{1,7}' source.txt > test.txt

alguma sugestão?

    
por Tony 19.10.2015 / 18:24

2 respostas

2

Por padrão, grep usa Expressões regulares básicas (BRE), que não são suporte {N} . Se funcionar na linha de comando, você provavelmente terá grep alias para grep -E ou grep -P . Você pode verificar executando

alias | grep grep

Os aliases não estão habilitados em scripts. Conforme explicado em man bash :

Aliases are not expanded when the shell is not interactive, unless  the
expand_aliases  shell option is set using shopt.

Assim, em um shell não interativo, que é o que você obtém quando executa um script, os aliases não funcionam. Você tem duas opções, ativar os aliases explicitamente em seu script e, em seguida, fonte seu arquivo ~/.bashrc para obter as definições de alias (não há necessidade de escapar do , , a propósito):

#!/bin/bash
shopt -s expand_aliases
source ~/.bashrc
grep -o ',[a-z][a-z0-9]{1,7}' source.txt > test.txt

Ou, muito mais simples, use grep -E no próprio script:

#!/bin/bash
grep -Eo ',[a-z][a-z0-9]{1,7}' source.txt > test.txt

Você também pode considerar as ferramentas como awk projetadas para trabalhar com dados delimitados por campo Apesar. As chances são que eles vão tornar sua vida muito mais simples.

    
por 19.10.2015 / 19:13
0

Se o seu arquivo de texto tiver a mesma estrutura, você também pode usar o awk

awk -F"," '{print $5}' INPUTFILE.txt >> test.txt 

Há também cut como Costas mencionado nos comentários

cut -d"," -f5 INPUTFILE.txt >> test.txt 
    
por 19.10.2015 / 19:39