Usando sed / awk per rimuovere qualsiasi cosa dopo il primo spazio


20
aaaaaaaa 09  
bbbbbbbb 90   
ccccccccccccccc  89  
ddddd 09

Usando sed / awk / replace, nel testo sopra voglio rimuovere tutto ciò che viene dopo il primo spazio in ogni riga. Ad esempio, l'output sarà:

aaaaaaaa  
bbbbbbbb    
ccccccccccccccc  
ddddd 

Qualsiasi aiuto sarà apprezzato.

Risposte:


35

sed

sed 's/\s.*$//'

grep

grep -o '^\S*'

awk

awk '{print $1}'

Come sottolineato nei commenti, -oPOSIX non è; tuttavia sia GNU che BSD ce l'hanno, quindi dovrebbe funzionare per la maggior parte delle persone.

Inoltre, \s/ \Spotrebbe non essere su tutti i sistemi, se il tuo non lo riconosce puoi usare uno spazio letterale, o se vuoi spazio e tabulazione, quelli in una parentesi ( [...]) o la [[:blank:]]classe di caratteri (nota che a rigor di termini\s è equivalente [[:space:]]e include i caratteri di spaziatura verticale e CR, LF o VT che probabilmente non ti interessano).

L' awk uno si assume le linee non iniziano con un carattere vuoto.


14
cut -d ' ' -f 1 < your-file

sarebbe il più efficiente.


4
L'ho notato in molte delle tue risposte e mi chiedevo se ci fosse una ragione: sembra che tu abbia sempre aggiunto il reindirizzamento dell'input anche quando il comando può funzionare senza di esso. Puoi spiegare perché <è utile qui?
Joseph R.,

5
@JosephR. Intendi cut < filevs cut file? Quindi vedi unix.stackexchange.com/a/70759/22565
Stéphane Chazelas

il taglio può essere la soluzione migliore per problemi così semplici. Riserverei awk (o perl) per una corrispondenza più complessa.
ChuckCottrill,

@StephaneChazelas Grazie per la (caratteristica) intuizione :)
Joseph R.


1

E quello attraverso perl,

$ perl -pe 's/^([^ ]+) .*$/\1/' file
aaaaaaaa
bbbbbbbb
ccccccccccccccc
ddddd

Attraverso GNU grep,

$ grep -oP '^[^ ]*' file
bbbbbbbb
ccccccccccccccc
ddddd
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.