Unix: como ler o conteúdo original da linha do arquivo

6

Eu tenho um arquivo de dados, o conteúdo é o seguinte:

department: customer service  section: A
department: marketing         section: A
department: finance           section: A

Quando eu leio cada linha, eu extraio o nome do departamento usando o comando cut . Infelizmente, o programa irá automaticamente trim de todo o espaço redundante e, portanto, eu cortei o nome do departamento incorretamente.

cat dept.dat | while read line
do
    echo $line
    echo $line | cut -c 12-29
done

por exemplo. a linha original é:

department: marketing         section: A

Enquanto o programa trata esta linha como:

department: marketing section: A

Como posso ler a linha sem cortar todo o espaço redundante?

    
por Newbiee 18.08.2013 / 03:29

2 respostas

11

Você está perdendo os espaços ao expandir $line . Coloque aspas duplas em torno de sua expansão de variável e você preservará os espaços:

$ cat dept.dat | while read line
> do
>     echo "$line"
>     echo "$line" | cut -c 12-29"
> done
department: customer service  section: A
 customer service 
department: marketing         section: A
 marketing        
department: finance           section: A
 finance          
    
por 18.08.2013 / 03:57
1

correspondência de regex

Você também pode conseguir algo semelhante usando sed :

$ cat dept.dat | while read line
do
  echo "$line"
  echo "$line" | sed -e 's/.*: \(.*\)  .*//'
done

Você também pode usar awk :

$ cat dept.dat | while read line
do
  echo "$line"
  echo "$line" | awk '{sub(/.*nt: /,""); sub(/  .*/,""); print }'
done

Você também pode usar grep :

$ cat dept.dat | while read line
do
  echo "$line"
  echo "$line" | grep -oP '(?<=: ).*(?=  )'
done

NOTA: A solução grep assume uma versão recente de grep que inclui o PCRE (suporte à expressão regular Perl).

A principal diferença dessas soluções em relação a cut é que elas combinam com base em padrões em que a solução cut assume uma estrutura mais rígida (posições de caractere específicas) para os dados de entrada.

correspondência posicional estática

Uma alternativa ao uso de cut é usar a função awk do substr :

$ cat dept.dat | while read line
do
  echo "$line"
  echo "$line" | awk '{print substr($0,13,16)}'
done
    
por 18.08.2013 / 19:00

Tags