Imprimir palavra que não contém caractere

1

Meu arquivo está no seguinte formato:

this!,is!,another!,test,yes!
this!,is!,another!,column,yes!
no,not!,another!,column

Meu resultado deve ser:

test
column
no

Não deve conter o '!' personagem.

Eu tentei vários comandos sed e (e) grep, mas nenhum deles está funcionando bem.

    
por user17000 27.03.2012 / 16:35

6 respostas

5

Tente algo assim:

tr ',' '\n' < file.txt | grep -v \!
    
por 27.03.2012 / 16:49
3

Supondo que você realmente quis dizer ...

test
column
no
column

... aqui está uma solução awk :

awk -v RS=, '{ for (i=1; i<=NF; i++) if($i !~ /!/) print $i; }'
    
por 27.03.2012 / 16:51
3

requer o grep do GNU:

grep -oP '(?<=^|,)[^!]+(?=,|$)'

com base na sua entrada, que informa:

test
column
no
column

Se você não quiser que "coluna" apareça duas vezes: grep -oP '(?<=^|,)[^!]+(?=,|$)' | sort -u

    
por 27.03.2012 / 17:06
2

O Perl é feito para esse tipo de tarefa. Como sobre este perl (v5.10 e acima) um forro:

perl -aF, -nE 'for (@F) { say $_ unless m/!/ }'

  • -a para o modo de preenchimento automático
  • -F, linhas de entrada divididas na vírgula
  • -n insere automaticamente o código para iterar as linhas de entrada, não imprima automaticamente
  • -E executar fornecido por código no loop

Se você tem um perl mais antigo, faça o seguinte: s / -E / -e /, s / dizer / print /

    
por 27.03.2012 / 17:54
1

assumindo que seu arquivo de texto é test.txt , o seguinte:

for word in $(cat test.txt | sed -e 's/,/ /g'); do if [ ! "$( echo "$word" | grep '\!' )" == "$word" ]; then echo "$word"; fi; done

me dá:

test
column
no
column
    
por 27.03.2012 / 16:56
1

também há solução em sed puro

sed 's/\([,]\)*[^,]*![^,]*[,]*//g;s/,$//;s/,/\n/g' file.txt
    
por 27.03.2012 / 18:12

Tags