grep: rimuove il testo dopo il token delimitatore


12

Ho un file in cui devo eliminare tutto dopo il primo ;su ogni riga.

Quindi un file come questo:

sdfsdsdf;
fsdfsddf;sdfsd;

Ne risulterà:

sdfsdsdf
fsdfsddf

Ho esaminato grepe sed. Gradirei una risposta che incorpori uno di questi comandi.

Risposte:


5

sed è probabilmente più semplice e veloce di awk o perl in questa circostanza:

sed 's/^\([^;][^;]*\);.*$/\1/' some_file_name

6
Questo è più complicato di quanto dovrebbe essere! sed 's/;.*//'
Gilles 'SO- smetti di essere malvagio' il

Mi permetto di dissentire. perl -pe 's /;.*//' some_file_name è altrettanto semplice e probabilmente fino al 1500% più veloce quando si opera in file di grandi dimensioni.
codehead

Ho diversi sistemi in cui sed è disponibile ma perl non lo è, quindi incoraggio a usare soluzioni più leggere dove sono sufficienti.
dubiousjim,

7

un'altra opzione è usare il cutcomando

cat a.file | cut -d';' -f1

9
inutili noi di gatto

3

Di solito lo uso awkper cose come questa:

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

Ciò prenderà ogni riga di un file e stamperà il primo gruppo prima del delimitatore -F


7
uso inutile di cat.
In pausa fino a ulteriore avviso.

1
Secondo Dennis lì. E sotto Linux e BSD che -F = ";" non funziona come previsto. E potresti voler citare anche quel $ 1: awk -F ";" '{print $ 1}' a. file
codehead

2

Ecco un modo per farlo usando GNU grep:

grep -Po "^[^;]+(?=;?)" filename

Senza Gnu grep: grep -Eo '^[^;]+;' filenamequasi ci riesce, stampa solo un personaggio di troppo. grep -Eo '^[^;]+' filenamequasi lo ottiene anche, ma stamperà anche linee complete (non vuote) che non ne hanno ;.
dubiousjim,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.