String comparando com curingas

0

Estou tentando verificar a primeira e a última linha de um arquivo para ver se ele contém uma determinada string. O arquivo seguirá o formato

HEADER 2016-11-7
...
TOTAL IS:    20938

Estou tentando verificar se a primeira linha contém a string HEADER e, em seguida, removê-la. Eu tenho:

#get first line of file
header='head -n +1 rubbish.txt'

echo $header

#If first line contains header, remove it and ouput it to new file
case "HEADER" in
    *"$header"*) tail -n +2 rubbish.txt > rubbish.txt.out
    header="TRUE"
    ;;
    *) echo no HEADER present ;;
esac

quais saídas:

HEADER 10-10-2019                                                                                                                                                                                                                                       
no HEADER present

Por que está dizendo que nenhum cabeçalho está presente?

    
por Nanor 07.11.2016 / 14:47

2 respostas

3

Porque você trocou o word pelo pattern ; você quer algo ao longo das linhas de:

...
case "$header" in
    HEADER*) tail -n +2 rubbish.txt > rubbish.txt.out
    header="TRUE"
    ;;
    *) echo no HEADER present ;;
esac
...

Outra maneira de atingir seu objetivo é usar sed para excluir uma linha de cabeçalho somente se ela existir (aqui usando a extensão GNU -i para editar no local):

sed -i '1{/^HEADER/d}' rubbish.txt

Um exemplo semelhante para uma possível linha de rodapé na última linha ( $ ) do arquivo:

sed -i '${/^TOTAL IS:/d}'  rubbish.txt
    
por 07.11.2016 / 14:53
0

Uso incorreto de case . Use if com globbing.

if [[ "$(head -n +1 rubbish.txt)" =~ "HEADER" ]]; then
    tail -n +2 rubbish.txt > rubbish.txt.out
else echo no HEADER present
fi
    
por 07.11.2016 / 14:52