grep - removendo texto após o token delimitador

12

Eu tenho um arquivo no qual preciso eliminar tudo após o primeiro ;de cada linha.

Então, um arquivo como este:

sdfsdsdf;
fsdfsddf;sdfsd;

Isso resultará em:

sdfsdsdf
fsdfsddf

Eu olhei grepe sed. Eu apreciaria uma resposta incorporando um desses comandos.

coletor de lixo
fonte

Respostas:

5

sed é provavelmente mais fácil e rápido do que awk ou perl nesta circunstância:

sed 's/^\([^;][^;]*\);.*$/\1/' some_file_name
Bruce Ediger
fonte
6
Isso é mais complicado do que deveria ser! sed 's/;.*//'
Gilles 'SO- stop being evil'
Eu peço desculpa mas não concordo. o perl -pe 's /;.*//' some_file_name é igualmente fácil, e sem dúvida até 1500% mais rápido ao operar em arquivos grandes.
codehead 24/08/10
Eu tenho vários sistemas em que o sed está disponível, mas o perl não, por isso encorajo o uso de soluções de menor peso, onde forem suficientes.
precisa
7

outra opção é usar o cutcomando

cat a.file | cut -d';' -f1
Richm
fonte
9
inútil us de gato
3

Eu normalmente uso awkpara coisas como esta:

cat a.file | awk -F=";" '{ print $1 }'

Isso pega cada linha de um arquivo e imprime o primeiro grupo antes do delimitador -F

Marco Ceppi
fonte
7
uso inútil de cat.
Pausado até novo aviso.
1
Segundo Dennis lá. E no linux e BSD isso -F = ";" não funciona como pretendido. E você também pode citar esses $ 1: awk -F ";" '{print $ 1}' a.file
codehead
2

Aqui está uma maneira de fazer isso usando o GNU grep:

grep -Po "^[^;]+(?=;?)" filename
Pausado até novo aviso.
fonte
Sem o Gnu grep: grep -Eo '^[^;]+;' filenamequase entende, apenas imprime um caractere a mais. grep -Eo '^[^;]+' filenamequase consegue também, mas também imprime linhas completas (não vazias) que não possuem nenhuma ;.
precisa