ฉันลองใช้grep -v '^$'
Linux และไม่ได้ผล ไฟล์นี้มาจากระบบไฟล์ Windows
ฉันลองใช้grep -v '^$'
Linux และไม่ได้ผล ไฟล์นี้มาจากระบบไฟล์ Windows
คำตอบ:
ลองทำสิ่งต่อไปนี้:
grep -v -e '^$' foo.txt
-e
ตัวเลือกที่ช่วยให้รูปแบบ regex สำหรับการจับคู่
เครื่องหมายคำพูดเดี่ยว ๆ^$
ทำให้ Cshell ทำงานได้ กระสุนอื่น ๆ จะมีความสุขกับราคาเดียวหรือสองครั้ง
UPDATE: สิ่งนี้ใช้ได้กับฉันสำหรับไฟล์ที่มีบรรทัดว่างหรือ "พื้นที่สีขาวทั้งหมด" (เช่นเส้น windows ที่มี "\ r \ n" การสิ้นสุดบรรทัดสไตล์) ในขณะที่ข้างต้นจะลบไฟล์ที่มีบรรทัดว่างและสิ้นสุดสไตล์บรรทัด unix เท่านั้น:
grep -v -e '^[[:space:]]*$' foo.txt
grep -E -v
อย่างนี้ทุกอย่างหลังจาก-e
ถูกตีความว่าเป็นรูปแบบ
grep -v -e '^[[:space:]]*$' -e '^#' file
จะให้บรรทัดที่ไม่ว่างเปล่าและไม่มีความคิดเห็นทั้งหมดในสคริปต์หรือไฟล์กำหนดค่า (หรือประเภทไฟล์ใด ๆ ที่ใช้อักขระแฮชสำหรับความคิดเห็น)
-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
.
ง่าย ๆ เข้าไว้.
grep . filename.txt
ใช้:
$ dos2unix file
$ grep -v "^$" file
หรือเพียงแค่ awk:
awk 'NF' file
หากคุณไม่มี dos2unix คุณสามารถใช้เครื่องมือเช่นtr :
tr -d '\r' < "$file" > t ; mv t "$file"
awk
ไม่ว่า
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
ฉันชอบที่จะใช้egrep
แต่ในการทดสอบของฉันกับไฟล์ของแท้ที่มีบรรทัดว่างวิธีการของคุณทำงานได้ดี (แต่ไม่มีเครื่องหมายคำพูดในการทดสอบของฉัน) สิ่งนี้ใช้ได้เช่นกัน:
egrep -v "^(\r?\n)?$" filename.txt
หากคุณมีลำดับของบรรทัดว่างหลายบรรทัดในหนึ่งแถวและต้องการเพียงหนึ่งบรรทัดว่างต่อหนึ่งลำดับลอง
grep -v "unwantedThing" foo.txt | cat -s
cat -s
ไม่แสดงบรรทัดเอาต์พุตว่างซ้ำ ๆ
ผลลัพธ์ของคุณจะไปจาก
match1
match2
ถึง
match1
match2
บรรทัดว่างสามบรรทัดในเอาต์พุตต้นฉบับจะถูกบีบอัดหรือ "บีบ" เป็นบรรทัดว่างหนึ่งบรรทัด
awk 'NF' file-with-blank-lines > file-with-no-blank-lines
เช่นเดียวกับคำตอบก่อนหน้า:
grep -v -e '^$' foo.txt
ที่นี่grep -e
หมายถึงgrepเวอร์ชันเพิ่มเติม '^ $' หมายความว่าไม่มีอักขระระหว่าง ^ (เริ่มต้นบรรทัด) และ $ (ท้ายบรรทัด) '^' และ '$' เป็นตัวอักษร regex
ดังนั้นคำสั่งgrep -v
จะพิมพ์บรรทัดทั้งหมดที่ไม่ตรงกับรูปแบบนี้ (ไม่มีอักขระระหว่าง ^ ถึง $)
ด้วยวิธีนี้บรรทัดว่างเปล่าจะถูกตัดออก
-e
ไม่ได้แปลว่า "grep รุ่นเพิ่มเติม" บางทีคุณอาจสับสนด้วย-E
? คู่มือชัดเจนว่า-e
เพียงแค่บอกอย่างชัดเจนว่ารูปแบบดังต่อไปนี้ เนื่องจากรูปแบบไม่ได้เริ่มต้นด้วยเส้นประและคุณกำหนดเพียงหนึ่งรูปแบบอยู่แล้วคุณอาจปล่อยให้เป็นไปตามค่าเริ่มต้น grep คาดว่ารูปแบบ regex หนึ่งรูปแบบ: grep -v '^$' foo.txt
(ไม่จำเป็นสำหรับฟังก์ชันการทำงานของ regex แบบขยาย) นอกจากนี้ยังมีมูลค่าการกล่าวขวัญว่าสิ่งนี้ไม่ได้กำจัดบรรทัดว่างในไฟล์เฉพาะสิ่งที่ถูกไพพ์ผ่านเอาต์พุต สำหรับกรณีนั้นsed -i
จะเป็นเครื่องมือที่เหมาะสม
ฉันพยายามอย่างหนัก แต่สิ่งนี้ดูเหมือนจะใช้ได้ (สมมติว่า\r
คุณกำลังกัดที่นี่):
printf "\r" | egrep -xv "[[:space:]]*"
ใช้ Perl:
perl -ne 'print if /\S/'
\S
หมายถึงการจับคู่อักขระที่ไม่ว่างเปล่า
egrep -v "^ \ s \ s +"
egrep ทำ regex แล้วและ \ s คือ white space
+ ซ้ำรูปแบบปัจจุบัน
^ เป็นจุดเริ่มต้น
ใช้:
grep pattern filename.txt | uniq
uniq
จะลดบรรทัดว่างที่อยู่ติดกันเป็นหนึ่งบรรทัดว่าง แต่ไม่ได้ลบออกทั้งหมด ยังฉันชอบพยายามใช้uniq
เช่นนั้น การเรียงลำดับแรกจะลบบรรทัดว่างทั้งหมดออกอย่างมีประสิทธิภาพโดยเหลือเพียงหนึ่งบรรทัด แต่การเรียงลำดับบรรทัดใหม่อาจไม่เป็นที่ยอมรับ
นี่เป็นอีกวิธีหนึ่งในการลบเส้นสีขาวและเส้นที่ขึ้นต้นด้วย#
เครื่องหมาย ฉันคิดว่ามันค่อนข้างมีประโยชน์ในการอ่านไฟล์กำหนดค่า
[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
เป็นความจริงที่การใช้grep -v -e '^ $'สามารถใช้งานได้ แต่จะไม่ลบบรรทัดว่างที่มีช่องว่าง 1 ช่องขึ้นไป ผมพบคำตอบที่ง่ายที่สุดและง่ายที่สุดสำหรับการลบบรรทัดว่างคือการใช้awk ต่อไปนี้เป็นการแก้ไขเล็กน้อยจาก awk guys ด้านบน:
awk 'NF' foo.txt
แต่เนื่องจากคำถามนี้ใช้ grep ฉันจะตอบต่อไปนี้:
grep -v '^ *$' foo.txt
หมายเหตุ : ช่องว่างระหว่าง ^ และ *
หรือคุณสามารถใช้ \ s เพื่อแสดงพื้นที่ว่างดังนี้:
grep -v '^\s*$' foo.txt