ใช้ sed -e "s/[[:space:]]\+/ /g"
นี่คือคำอธิบาย:
[ # start of character class
[:space:] # The POSIX character class for whitespace characters. It's
# functionally identical to [ \t\r\n\v\f] which matches a space,
# tab, carriage return, newline, vertical tab, or form feed. See
# https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes
] # end of character class
\+ # one or more of the previous item (anything matched in the brackets).
เพื่อทดแทนของคุณคุณต้องการแทรกช่องว่าง [:space:]
จะไม่ทำงานที่นั่นเพราะมันเป็นตัวย่อสำหรับคลาสของตัวละครและเอนจิน regex จะไม่รู้ว่าตัวละครตัวไหนที่ควรใส่
สิ่งที่+
จะต้องหลบหนีใน regex เพราะด้วยเครื่องยนต์ regex ของ sed +
เป็นตัวอักษรปกติในขณะที่\+
metacharacter สำหรับ 'หนึ่งหรือมากกว่า' ในหน้า 86 ของMastering Regular Expressions , Jeffrey Friedl กล่าวไว้ในเชิงอรรถว่าเอ็ดและ grep ใช้วงเล็บหนีเพราะ "Ken Thompson รู้สึกว่านิพจน์ทั่วไปจะใช้ในการทำงานกับรหัส C เป็นหลักซึ่งจำเป็นต้องจับคู่วงเล็บดิบจะธรรมดากว่าการอ้างอิงกลับ ." ฉันคิดว่าเขารู้สึกแบบเดียวกันกับเครื่องหมายบวกดังนั้นจึงจำเป็นต้องหลบหนีเพื่อใช้มันเป็นตัวบ่งชี้ มันง่ายที่จะรับสิ่งนี้
ใน sed คุณจะต้องหลบหนี+
, ?
, |
, และ(
)
หรือใช้ -r เพื่อใช้การขยายเพิ่มเติม (จากนั้นดูเหมือนsed -r -e "s/[[:space:]]\+/ /g"
หรือsed -re "s/[[:space:]]\+/ /g"