ฉันพยายามลบบรรทัดว่างโดยใช้ sed:
sed '/^$/d'
แต่ฉันไม่มีโชคกับมัน
ตัวอย่างเช่นฉันมีเส้นเหล่านี้:
xxxxxx
yyyyyy
zzzzzz
และฉันต้องการให้เป็นเช่น:
xxxxxx
yyyyyy
zzzzzz
สิ่งที่ควรเป็นรหัสสำหรับสิ่งนี้?
ฉันพยายามลบบรรทัดว่างโดยใช้ sed:
sed '/^$/d'
แต่ฉันไม่มีโชคกับมัน
ตัวอย่างเช่นฉันมีเส้นเหล่านี้:
xxxxxx
yyyyyy
zzzzzz
และฉันต้องการให้เป็นเช่น:
xxxxxx
yyyyyy
zzzzzz
สิ่งที่ควรเป็นรหัสสำหรับสิ่งนี้?
คำตอบ:
คุณอาจมีช่องว่างหรือแท็บในบรรทัด "ว่าง" ของคุณ ใช้คลาส POSIXด้วยsed
เพื่อลบบรรทัดทั้งหมดที่มีช่องว่างเท่านั้น:
sed '/^[[:space:]]*$/d'
เวอร์ชันที่สั้นกว่าที่ใช้ ERE ตัวอย่างเช่นกับ gnu sed:
sed -r '/^\s*$/d'
(โปรดทราบว่า sed ไม่รองรับ PCRE)
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
,
^\s*$
จะจับคู่บรรทัดทั้งหมด "empty" ว่างเปล่าที่นี่หมายถึงบรรทัดไม่มีตัวอักษรหรือบรรทัดประกอบด้วยสตริงว่างเท่านั้น (เช่นช่องว่าง) บรรทัดที่ตรงกันทั้งหมดจะถูกลบออกโดย sed พร้อมกับd
คำสั่ง
ฉันไม่มีawk
วิธีแก้ไข:
awk 'NF' file
ซึ่งจะกลับมา:
xxxxxx
yyyyyy
zzzzzz
มันทำงานอย่างไร เนื่องจากNF
หมายถึง "จำนวนฟิลด์" บรรทัดเหล่านั้นว่างเปล่ามี 0 fiedls ดังนั้น awk จะประเมินค่า 0 เป็น False และไม่มีการพิมพ์บรรทัด อย่างไรก็ตามหากมีอย่างน้อยหนึ่งฟิลด์การประเมินค่าเป็น True และawk
ดำเนินการตามค่าเริ่มต้น: พิมพ์บรรทัดปัจจุบัน
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
คุณจะรู้วิธีที่ดีที่จะรวมสิ่งนี้ไว้ในสคริปต์ awk-like เช่นรูปแบบหรือไม่? awk '/ mypattern / {do stuff ... }'
awk 'NF {do stuff...}'
ได้
sed '/^$/d'
ควรจะดีคุณคาดหวังว่าจะแก้ไขไฟล์ในสถานที่? ถ้าเป็นเช่นนั้นคุณควรใช้-i
ธง
บางทีบรรทัดเหล่านั้นอาจไม่ว่างเปล่าดังนั้นถ้าเป็นกรณีนี้ให้ดูที่คำถามนี้ลบบรรทัดว่างออกจาก txtfiles ลบช่องว่างออกจากจุดเริ่มต้นและจุดสิ้นสุดของบรรทัดฉันเชื่อว่านั่นคือสิ่งที่คุณพยายามจะทำให้สำเร็จ
sed -i '/^$/d'
เป็นวิธีหนึ่งในการทำมัน
[]
ควรไม่หนีในการแสดงออกวงเล็บดังนั้นรหัสที่นี่ไม่ได้ที่ถูกต้องสำหรับ\[\[:space:\]\]
หรือ\[ \t\]
- ควรจะเป็นและ[[:space:]]
[ \t]
ฉันเชื่อว่านี่เป็นวิธีที่ง่ายที่สุดและเร็วที่สุด:
cat file.txt | grep .
หากคุณต้องการละเว้นบรรทัดสีขาวทั้งหมดด้วยให้ลองทำดังนี้:
cat file.txt | grep '\S'
ตัวอย่าง:
s="\
\
a\
b\
\
Below is TAB:\
\
Below is space:\
\
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l
เอาท์พุท
7
5
cat
, grep
ใช้เวลาไฟล์เช่นกัน:grep . file.txt
grep '\S'
ไม่พกพาอย่างแน่นอน หากคุณมีgrep -P
แล้วคุณสามารถใช้grep -P '\S'
แต่ไม่รองรับในทุกแพลตฟอร์ม
grep .
เปรียบเทียบกับโซลูชั่นอื่น ๆ คือมันจะเน้นข้อความทั้งหมดในสีแดง โซลูชันอื่น ๆ สามารถคงสีเดิมไว้ได้ เปรียบเทียบunbuffer apt search foo | grep .
กับunbuffer apt search foo | grep -v ^$
ด้วยความช่วยเหลือจากคำตอบที่ยอมรับได้ที่นี่และคำตอบที่ได้รับการยอมรับฉันใช้:
$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt
`s/^ *//` => left trim
`s/ *$//` => right trim
`/^$/d` => remove empty line
`/^\s*$/d` => delete lines which may contain white space
นี้ครอบคลุมทุกฐานและทำงานได้อย่างสมบูรณ์แบบสำหรับความต้องการของฉัน ความรุ่งโรจน์ของผู้โพสต์ดั้งเดิม @Kent และ @kev
คุณสามารถพูดได้:
sed -n '/ / p' filename #there is a space between '//'
print all lines except the empty one(s)
และเงียบสงบ
อีกตัวเลือกหนึ่งโดยไม่ต้องsed
, awk
, perl
ฯลฯ
strings $file > $output
strings - พิมพ์สตริงของตัวอักษรที่พิมพ์ได้ในไฟล์
strings
แทนstring
?
คุณสามารถทำสิ่งเช่นนั้นโดยใช้ "grep" เช่นกัน:
egrep -v "^$" file.txt
งานนี้ใน awk เช่นกัน
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
คุณมักจะเห็นพฤติกรรมที่ไม่คาดคิดเพราะไฟล์ข้อความของคุณถูกสร้างขึ้นบน Windows \r\n
ดังนั้นในตอนท้ายของลำดับสาย คุณสามารถใช้ dos2unix เพื่อแปลงเป็นไฟล์ข้อความสไตล์ UNIX ก่อนเรียกใช้ sed หรือใช้
sed -r "/^\r?$/d"
เพื่อลบบรรทัดว่างไม่ว่าจะมีการขึ้นบรรทัดใหม่หรือไม่
-r
ธงทำและเป็นไปได้ที่จะรวมกับ-i
การแก้ไขไฟล์โดยตรงและหลีกเลี่ยงการพิมพ์ไปที่หน้าจอ นอกจากนี้ฉันคิดว่าคำสั่งนี้จะทำงานเป็นsed -r "/^\r$/d"
bash
คำตอบเฉพาะของฉันคือการแนะนำให้ใช้perl
ตัวดำเนินการทดแทนพร้อมกับg
แฟล็กรูปแบบโกลบอลสำหรับสิ่งนี้ดังนี้:
$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
คำตอบนี้แสดงให้เห็นถึงการบัญชีว่าบรรทัดว่างมีช่องว่างในนั้นหรือไม่[\ ]*
รวมทั้งใช้|
เพื่อแยกคำค้นหา / หลายฟิลด์ ทดสอบบน macOS High Sierra และ CentOS 6/7
FYI, รหัสดั้งเดิมของ OP sed '/^$/d' $file
ทำงานได้ดีในbash
Terminal บน macOS High Sierra และ CentOS 6/7 Linux ที่คลัสเตอร์ซูเปอร์คอมพิวเตอร์ประสิทธิภาพสูง
สำหรับฉันด้วย FreeBSD 10.1 ที่มีsed ใช้งานได้เฉพาะโซลูชันนี้:
sed -e '/^[ ]*$/d' "testfile"
ภายใน[]
มีสัญลักษณ์ช่องว่างและแท็บ
ไฟล์ทดสอบประกอบด้วย:
fffffff next 1 tabline ffffffffffff
ffffffff next 1 Space line ffffffffffff
ffffffff empty 1 lines ffffffffffff
============ EOF =============