ลบบรรทัดว่างด้วย grep


คำตอบ:


300

ลองทำสิ่งต่อไปนี้:

grep -v -e '^$' foo.txt

-eตัวเลือกที่ช่วยให้รูปแบบ regex สำหรับการจับคู่

เครื่องหมายคำพูดเดี่ยว ๆ^$ทำให้ Cshell ทำงานได้ กระสุนอื่น ๆ จะมีความสุขกับราคาเดียวหรือสองครั้ง

UPDATE: สิ่งนี้ใช้ได้กับฉันสำหรับไฟล์ที่มีบรรทัดว่างหรือ "พื้นที่สีขาวทั้งหมด" (เช่นเส้น windows ที่มี "\ r \ n" การสิ้นสุดบรรทัดสไตล์) ในขณะที่ข้างต้นจะลบไฟล์ที่มีบรรทัดว่างและสิ้นสุดสไตล์บรรทัด unix เท่านั้น:

grep -v -e '^[[:space:]]*$' foo.txt

egrep นั้นจะใช้งานได้เฉพาะไฟล์ที่มีศูนย์หรือ 1 ช่องว่างในบรรทัดไม่ใช่สำหรับไฟล์ที่มีช่องว่าง 2 หรือมากกว่า เปลี่ยนไหม ถึง *.
Ed Morton

4
ควรเป็นgrep -E -vอย่างนี้ทุกอย่างหลังจาก-eถูกตีความว่าเป็นรูปแบบ
jazzpi

6
grep -v -e '^[[:space:]]*$' -e '^#' fileจะให้บรรทัดที่ไม่ว่างเปล่าและไม่มีความคิดเห็นทั้งหมดในสคริปต์หรือไฟล์กำหนดค่า (หรือประเภทไฟล์ใด ๆ ที่ใช้อักขระแฮชสำหรับความคิดเห็น)
palswim

" -eตัวเลือกนี้อนุญาตรูปแบบการจับคู่ regex" ที่มีความเข้าใจผิด -eคือคำจำกัดความ (POSIX-) สำหรับ: This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).(จากคู่มือ ) Grep คาดว่าจะมีการแสดงออกปกติ (ขั้นพื้นฐาน) เป็นค่าเริ่มต้น สำหรับรูปแบบนี้คุณอาจออกไป-eโดยสิ้นเชิง: grep -v '^[[:space:]]*$' foo.txt.
Yeti

73

ง่าย ๆ เข้าไว้.

grep . filename.txt

1
นี่ทำให้ฉันเห็นทุกบรรทัดในไฟล์
phuclv

2
@ LưuVĩnhPhúcมันควรจะส่งออกบรรทัดทั้งหมดในไฟล์ยกเว้นบรรทัดว่าง
Frej Connolly

2
สิ่งนี้ใช้ได้กับฉันในไฟล์จากระบบที่ใช้ Linux แต่ไม่ได้อยู่ในไฟล์จาก Windows น่าจะเป็นเพราะตัวอักษรที่ลงท้ายด้วย Windows

ฉัน upvoting นี้แม้ว่ามันจะไม่ได้แก้ปัญหาของ OP ในการจัดการไฟล์ด้วยการสิ้นสุดบรรทัด Windows แต่เนื่องจากฉันไม่มีปัญหานี้กลายเป็นโซลูชั่นที่สมบูรณ์แบบสำหรับฉัน
David Z

1
นี่คือทางออกที่สมบูรณ์แบบ ง่ายและทำงานบน Linux
W00f

30

ใช้:

$ dos2unix file
$ grep -v "^$" file

หรือเพียงแค่ awk:

awk 'NF' file

หากคุณไม่มี dos2unix คุณสามารถใช้เครื่องมือเช่นtr :

tr -d '\r' < "$file" > t ; mv t "$file"

ไม่พบโปรแกรม dos2unix นั่นสำหรับ Windows ใช่ไหม คำสั่ง ask ไม่ทำงานเช่นกัน
โหนดนินจา

ถาม? awkไม่ว่า
iconoclast

จุดที่ดีเกี่ยวกับการแปลงเป็นจุดสิ้นสุดของบรรทัดสไตล์ UNIX มิฉะนั้นนิพจน์ทั่วไปอาจไม่ทำงานอย่างที่คาดไว้ ที่นี่ไม่มีอะไรทำงานให้ฉันจนกว่าฉันจะแปลงปลายสาย
Ryan H.

16
grep -v "^[[:space:]]*$"

The -v makes it print lines that do not completely match

===Each part explained===
^             match start of line
[[:space:]]   match whitespace- spaces, tabs, carriage returns, etc.
*             previous match (whitespace) may exist from 0 to infinite times
$             match end of line

ใช้รหัส -

$ echo "
> hello
>       
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok

เพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับวิธีการทำงานของเหตุใดฉันจึงแนะนำให้อ่านนิพจน์ทั่วไป http://www.regular-expressions.info/tutorial.html


2
มันทำงานอย่างไรและทำไม? คำตอบของคุณจะดีขึ้นมากถ้าคุณสามารถอธิบายได้ ยกตัวอย่างเช่นนิพจน์ปกติของคุณตรงกับจุดเริ่มต้นของสตริงแล้วเว้นวรรคอย่างน้อยหนึ่งรายการโดยใช้มาตรฐาน POSIX แล้วตามด้วยจุดสิ้นสุดของสตริงเช่นด้วย grep -v มันจะลบบรรทัดทั้งหมดที่เป็นช่องว่างเท่านั้น ขวา? จะเกิดอะไรขึ้นถ้าไม่มีที่ว่าง เป็นเพียงอักขระขึ้นบรรทัดใหม่ใช่หรือไม่
เบ็น

ตามตัวอย่างของฉันแสดงให้เห็นว่าแม้เพียงบรรทัดว่างจะถูกลบออก (บรรทัดแรก) ฉันเพิ่มข้อมูลเพิ่มเติมดังนั้นหวังว่าจะช่วยได้ :)
Sepero

3

ฉันชอบที่จะใช้egrepแต่ในการทดสอบของฉันกับไฟล์ของแท้ที่มีบรรทัดว่างวิธีการของคุณทำงานได้ดี (แต่ไม่มีเครื่องหมายคำพูดในการทดสอบของฉัน) สิ่งนี้ใช้ได้เช่นกัน:

egrep -v "^(\r?\n)?$" filename.txt

พยายามอย่างนั้น บรรทัดว่างยังคงแสดง อาจเป็นเพราะไฟล์นี้ถูกสร้างใน Windows?
โหนดนินจา

3

หากคุณมีลำดับของบรรทัดว่างหลายบรรทัดในหนึ่งแถวและต้องการเพียงหนึ่งบรรทัดว่างต่อหนึ่งลำดับลอง

grep -v "unwantedThing" foo.txt | cat -s

cat -s ไม่แสดงบรรทัดเอาต์พุตว่างซ้ำ ๆ

ผลลัพธ์ของคุณจะไปจาก

match1



match2

ถึง

match1

match2

บรรทัดว่างสามบรรทัดในเอาต์พุตต้นฉบับจะถูกบีบอัดหรือ "บีบ" เป็นบรรทัดว่างหนึ่งบรรทัด



2

เช่นเดียวกับคำตอบก่อนหน้า:

grep -v -e '^$' foo.txt

ที่นี่grep -eหมายถึงgrepเวอร์ชันเพิ่มเติม '^ $' หมายความว่าไม่มีอักขระระหว่าง ^ (เริ่มต้นบรรทัด) และ $ (ท้ายบรรทัด) '^' และ '$' เป็นตัวอักษร regex

ดังนั้นคำสั่งgrep -vจะพิมพ์บรรทัดทั้งหมดที่ไม่ตรงกับรูปแบบนี้ (ไม่มีอักขระระหว่าง ^ ถึง $)

ด้วยวิธีนี้บรรทัดว่างเปล่าจะถูกตัดออก


-eไม่ได้แปลว่า "grep รุ่นเพิ่มเติม" บางทีคุณอาจสับสนด้วย-E? คู่มือชัดเจนว่า-eเพียงแค่บอกอย่างชัดเจนว่ารูปแบบดังต่อไปนี้ เนื่องจากรูปแบบไม่ได้เริ่มต้นด้วยเส้นประและคุณกำหนดเพียงหนึ่งรูปแบบอยู่แล้วคุณอาจปล่อยให้เป็นไปตามค่าเริ่มต้น grep คาดว่ารูปแบบ regex หนึ่งรูปแบบ: grep -v '^$' foo.txt(ไม่จำเป็นสำหรับฟังก์ชันการทำงานของ regex แบบขยาย) นอกจากนี้ยังมีมูลค่าการกล่าวขวัญว่าสิ่งนี้ไม่ได้กำจัดบรรทัดว่างในไฟล์เฉพาะสิ่งที่ถูกไพพ์ผ่านเอาต์พุต สำหรับกรณีนั้นsed -iจะเป็นเครื่องมือที่เหมาะสม
Yeti

1

ฉันพยายามอย่างหนัก แต่สิ่งนี้ดูเหมือนจะใช้ได้ (สมมติว่า\rคุณกำลังกัดที่นี่):

printf "\r" | egrep -xv "[[:space:]]*"

ถ้าฉันแทนที่ส่วนแรกด้วยผลลัพธ์จากไฟล์
โหนดนินจา


0

egrep -v "^ \ s \ s +"

egrep ทำ regex แล้วและ \ s คือ white space

+ ซ้ำรูปแบบปัจจุบัน

^ เป็นจุดเริ่มต้น


0

ใช้:

grep pattern filename.txt | uniq

uniqจะลดบรรทัดว่างที่อยู่ติดกันเป็นหนึ่งบรรทัดว่าง แต่ไม่ได้ลบออกทั้งหมด ยังฉันชอบพยายามใช้uniqเช่นนั้น การเรียงลำดับแรกจะลบบรรทัดว่างทั้งหมดออกอย่างมีประสิทธิภาพโดยเหลือเพียงหนึ่งบรรทัด แต่การเรียงลำดับบรรทัดใหม่อาจไม่เป็นที่ยอมรับ
Zach Young

จุดดี. สิ่งนี้จะทำให้เกิดเส้นที่ซ้ำกัน ฉันเดาทางออกของฉันแนะนำข้อบกพร่อง
baitisj

0

นี่เป็นอีกวิธีหนึ่งในการลบเส้นสีขาวและเส้นที่ขึ้นต้นด้วย#เครื่องหมาย ฉันคิดว่ามันค่อนข้างมีประโยชน์ในการอ่านไฟล์กำหนดค่า

[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults    requiretty
Defaults   !visiblepw
Defaults    always_set_home
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
stack ALL=(ALL) NOPASSWD: ALL

0

เป็นความจริงที่การใช้grep -v -e '^ $'สามารถใช้งานได้ แต่จะไม่ลบบรรทัดว่างที่มีช่องว่าง 1 ช่องขึ้นไป ผมพบคำตอบที่ง่ายที่สุดและง่ายที่สุดสำหรับการลบบรรทัดว่างคือการใช้awk ต่อไปนี้เป็นการแก้ไขเล็กน้อยจาก awk guys ด้านบน:

awk 'NF' foo.txt

แต่เนื่องจากคำถามนี้ใช้ grep ฉันจะตอบต่อไปนี้:

grep -v '^ *$' foo.txt

หมายเหตุ : ช่องว่างระหว่าง ^ และ *

หรือคุณสามารถใช้ \ s เพื่อแสดงพื้นที่ว่างดังนี้:

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