Tente algo assim:
tr ',' '\n' < file.txt | grep -v \!
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.
Tente algo assim:
tr ',' '\n' < file.txt | grep -v \!
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; }'
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
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/!/ }'
Se você tem um perl mais antigo, faça o seguinte: s / -E / -e /, s / dizer / print /
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
também há solução em sed puro
sed 's/\([,]\)*[^,]*![^,]*[,]*//g;s/,$//;s/,/\n/g' file.txt