Menggunakan sed / awk untuk menghapus apa pun setelah ruang pertama

20
aaaaaaaa 09  
bbbbbbbb 90   
ccccccccccccccc  89  
ddddd 09

Menggunakan sed / awk / replace, dalam teks di atas saya ingin menghapus apa pun yang muncul setelah spasi pertama di setiap baris. Misalnya outputnya adalah:

aaaaaaaa  
bbbbbbbb    
ccccccccccccccc  
ddddd 

bantuan apa pun akan dihargai.

Rana Khan
sumber

Jawaban:

35

Sed

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

Grep

grep -o '^\S*'

Awk

awk '{print $1}'

Seperti yang ditunjukkan dalam komentar, -obukan POSIX; namun baik GNU dan BSD memilikinya, jadi itu harus bekerja untuk kebanyakan orang.

Juga, \s/ \Smungkin tidak ada di semua sistem, jika sistem Anda tidak mengenalinya, Anda dapat menggunakan ruang literal, atau jika Anda ingin ruang dan tab, yang ada dalam ekspresi kurung ( [...]), atau [[:blank:]]kelas karakter (perhatikan bahwa dengan tegas \sadalah setara dengan [[:space:]]dan termasuk karakter spasi vertikal juga seperti CR, LF atau VT yang Anda mungkin tidak peduli).

Yang awk mengasumsikan garis tidak dimulai dengan karakter kosong.

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

akan menjadi yang paling efisien.

Stéphane Chazelas
sumber
4
Saya perhatikan ini di beberapa jawaban Anda dan saya bertanya-tanya apakah ada alasan untuk itu: Anda sepertinya selalu menambahkan pengalihan input bahkan ketika perintah dapat bekerja tanpanya. Bisakah Anda jelaskan mengapa <ini berguna di sini?
Joseph R.
5
@ JosephephR. Maksudmu cut < filevs cut file? Kemudian lihat unix.stackexchange.com/a/70759/22565
Stéphane Chazelas
cut mungkin solusi terbaik untuk masalah sederhana ini. Saya akan memesan awk (atau perl) untuk pencocokan yang lebih kompleks.
ChuckCottrill
@StephaneChazelas Terima kasih atas wawasan (karakteristik) :)
Joseph R.
5
awk '{print $1}' file

atau

sed 's/ .*//'
Jlliagre
sumber
1

Dan yang melaluinya perl,

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

Melalui GNU grep,

$ grep -oP '^[^ ]*' file
bbbbbbbb
ccccccccccccccc
ddddd
Avinash Raj
sumber