ใช้ sed / awk เพื่อลบอะไรหลังจากช่องว่างแรก


20
aaaaaaaa 09  
bbbbbbbb 90   
ccccccccccccccc  89  
ddddd 09

ใช้ sed / awk / replace ในข้อความด้านบนฉันต้องการลบสิ่งที่เกิดขึ้นหลังจากช่องว่างแรกในแต่ละบรรทัด ตัวอย่างเช่นผลลัพธ์จะเป็น:

aaaaaaaa  
bbbbbbbb    
ccccccccccccccc  
ddddd 

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม.

คำตอบ:


35

sed

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

grep

grep -o '^\S*'

awk

awk '{print $1}'

ตามที่ระบุไว้ในความคิดเห็น-oไม่ใช่ POSIX อย่างไรก็ตามทั้ง GNU และ BSD มีดังนั้นจึงควรทำงานให้กับคนส่วนใหญ่

นอกจากนี้\s/ \Sอาจไม่ได้อยู่ในทุกระบบหากคุณจำไม่ได้ว่าคุณสามารถใช้พื้นที่ตามตัวอักษรหรือถ้าคุณต้องการที่ว่างและแท็บพื้นที่ในการแสดงออกวงเล็บ ( [...]) หรือ[[:blank:]]คลาสตัวละคร (ทราบว่าการพูดอย่างเคร่งครัด\sคือ เทียบเท่า[[:space:]]และรวมถึงอักขระระยะห่างแนวตั้งเช่น CR, LF หรือ VT ซึ่งคุณอาจไม่สนใจ)

awk หนึ่งถือว่าเส้นไม่ได้เริ่มต้นด้วยตัวอักษรว่างเปล่า


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

จะมีประสิทธิภาพมากที่สุด


4
ฉันสังเกตเห็นสิ่งนี้ในหลายคำตอบของคุณและฉันสงสัยว่ามีเหตุผลหรือไม่: คุณดูเหมือนจะเพิ่มการเปลี่ยนเส้นทางอินพุตเสมอแม้ว่าคำสั่งจะทำงานได้โดยไม่ต้องทำก็ตาม คุณช่วยอธิบายได้<ไหมว่าทำไมถึงมีประโยชน์ที่นี่
โจเซฟอาร์

5
@JosephR คุณหมายถึงcut < filevs cut file? จากนั้นดูunix.stackexchange.com/a/70759/22565
Stéphane Chazelas

การตัดอาจเป็นวิธีแก้ปัญหาที่ง่ายที่สุดสำหรับปัญหานี้ ฉันจะจอง awk (หรือ perl) สำหรับการจับคู่ที่ซับซ้อนมากขึ้น
ChuckCottrill

@StephaneChazelas ขอบคุณสำหรับ (ลักษณะ) ความเข้าใจ :)
โจเซฟอาร์


1

และที่ผ่านperlมา

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

ผ่าน GNU grep

$ grep -oP '^[^ ]*' file
bbbbbbbb
ccccccccccccccc
ddddd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.