หากคุณมีคุณสมบัติคำว่าหมายถึงลำดับของอักขระที่ไม่ว่าง 1 ตัวหรือมากกว่านั้นคำตอบคือใช่แน่นอนและมันก็ทำได้ง่ายเช่นกัน นี่เป็นเพราะ[[:blank:]]*
และ[^[:blank:]]*
เป็นบูลีนที่เติมเต็มและ - ให้อักขระทั้งหมดในสตริงสมบูรณ์ - [[:blank:]]*
U [^[:blank:]]*
สามารถอธิบายสตริงที่เป็นไปได้ในลักษณะเดียวกับที่.*
ทำ
หากมีอักขระที่ไม่สมบูรณ์หรือลำดับไบต์ที่ไม่ถูกต้องมีอยู่ในสตริงจะไม่สามารถอธิบายได้ตั้งแต่ต้นจนจบ - ซึ่งบางครั้งอาจเกิดขึ้นเมื่อตีความสตริงในการเข้ารหัสผิด เพื่อให้มั่นใจว่าอักขระสมบูรณ์ต่อไบต์ในสตริงใด ๆ โลแคล C สามารถบังคับดังนี้:
LC_ALL=C sed ...
... ซึ่งจะหลีกเลี่ยงปัญหาใด ๆ ที่อธิบายถึงสตริงจากหัวถึงท้ายด้วยรูปแบบรวมทุกอย่างเช่น.*
หรือ([ ]*[^ ]*)*
รูปแบบที่สมบูรณ์สามารถทำซ้ำได้บ่อยครั้งเท่าที่จำเป็นจากซ้ายไปขวาความยาวของสตริงใด ๆ ไปยังดินแดนที่เกิดขึ้นครั้งสุดท้ายที่เป็นไปได้โดยไม่ต้องหยุดพักในรูปแบบใด ๆ นี่คือภาษาปกติอย่างชัดเจน
BRE:
sed 's/\(\([^[:blank:]]*\)[[:blank:]]*\)*/\2/'
ERE:
sed -E 's/(([^[:blank:]]*)[[:blank:]]*)*/\2/'
ทั้งสองเวอร์ชันจะยังคงพิมพ์บรรทัดว่างและนี่เป็นเพราะ*
ดาวKleene ตรงกับรูปแบบที่เกิดขึ้นเป็นศูนย์หรือมากกว่า มันตรงกับตัวอักษรที่เป็นศูนย์หรือมากกว่าไม่ว่างเปล่าแล้วตัวอักษรที่ว่างเปล่าเป็นศูนย์หรือมากกว่านั้นแล้วเกิดขึ้นเป็นศูนย์หรือมากกว่าของการแข่งขันที่จัดกลุ่มจนกว่าจะได้ตรงกับสตริงในสิ่งทั้งปวง
เมื่อจับคู่ทั้งหมดนี้เวทมนตร์จะเกิดขึ้นในการแทนที่ - การอ้างอิงที่ส่งคืนโดยกลุ่ม\1
และ\2
เป็นเหตุการณ์ล่าสุดของแต่ละรายการ ดังนั้นเมื่อเปลี่ยนเป็นทำทั้งหมดของสตริงจะถูกแทนที่ด้วยเพียงเกิดขึ้นครั้งล่าสุดในสายของศูนย์หรือมากกว่าไม่ได้ตัวละครที่ว่างเปล่า - \2
หรือกลุ่มย่อย
แน่นอนว่าสิ่งนี้ใช้ได้กับสตริงที่เป็นไปได้ใด ๆ - แม้แต่อันที่ว่างเปล่า - ซึ่งหมายความว่าทั้งสองรูปแบบจะพิมพ์อักขระบรรทัดใหม่สำหรับบรรทัดที่มีอักขระว่างเปล่าเท่านั้นหรือไม่มีเลย เพื่อจัดการสิ่งนี้มีสองสิ่งที่คุณสามารถทำได้ แต่ก่อนอื่นเรามาทำให้คลาสของตัวละครง่ายขึ้นหน่อย:
b='[:blank:]'
ตอนนี้หากต้องการพิมพ์หากบรรทัดมีอักขระหนึ่งตัวหรือมากกว่าที่ไม่ใช่ว่างคุณสามารถทำได้:
BRE:
sed -n "s/\(\([^$b]*\)[$b]*\)*/\2/;/./p"
ERE:
sed -En "/[^$b]/s/(([^$b]*)[$b]*)*/\2/p"
- กรณี BRE - การทดแทนจะดำเนินการเสมอและเว้นวรรครูปแบบที่มีอักขระที่เหลืออย่างน้อยหนึ่งตัวเท่านั้นที่จะถูกพิมพ์
- กรณี ERE - การแทนที่ถูกพยายามบนพื้นที่รูปแบบที่มีอักขระถ่านอย่างน้อยหนึ่งตัวเท่านั้น
ทั้งสองแบบจะทำงานกับวิธีใดวิธีหนึ่ง - ตราบใดที่ไวยากรณ์ถูกต้อง
-n
สวิทช์ปิดการใช้งานอัตโนมัติการพิมพ์ของพื้นที่รูปแบบและp
ธงไปs///
ubstitution หรือ/
อยู่/
คำสั่งพิมพ์ผลของมันเท่านั้นหากประสบความสำเร็จ
ตรรกะเดียวกันนี้สามารถนำไปใช้เพื่อให้{num}
เกิดเหตุการณ์ใด ๆเช่นกันเช่น:
BRE:
sed -n "s/\([$b]*\([^$b]\{1,\}\)\)\{num\}.*/\2/p"
ERE:
sed -En "s/([$b]*([^$b]+)){num}.*/\2/p"
... โดยที่num
ทั้ง regexps สามารถถูกแทนที่ด้วยตัวเลขเพื่อพิมพ์เฉพาะ{num}
เหตุการณ์ที่ระบุของลำดับของอักขระที่ไม่ว่างเปล่า รูปแบบที่แตกต่างกันเล็กน้อยถูกนำมาใช้ที่นี่เพื่อให้แน่ใจว่าการนับจะไม่เบ้สำหรับพื้นที่ชั้นนำในสตริง
โปรดทราบว่า-E
สวิตช์ ERE sed
ได้รับการสนับสนุนทั้งในรุ่น BSD และ GNU แม้ว่าจะยังไม่มีไวยากรณ์มาตรฐาน POSIX
sed
หรือไม่