วิธีค้นหาช่องว่างในข้อความ ใช้ grep หรือไม่


13

วิธี grep ช่องว่างหนึ่งในข้อความ?

cat a.txt| grep ' '

หรือ

cat a.txt| grep '\s '

7
ใช้งานไม่ได้catทั้งสองกรณี สามารถเขียนครั้งแรกgrep ' ' a.txtที่สองการเปลี่ยนแปลงในทำนองเดียวกัน
MadHatter

1
โปรดทราบว่า\sยังตรงกับแท็บ, ผลตอบแทน, แท็บแนวตั้ง, ฟีดรูปแบบและเทคนิค, บรรทัดใหม่ หากคุณต้องการพื้นที่เพียงการแข่งขันและแท็บการใช้งานหรือ[[:blank:]] [ \t]
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

ใช้ gnu grep คุณสามารถ จำกัด จำนวนการแข่งขัน ( -mตัวเลือก) หนึ่ง ...
sendmoreinfo

นี่คือ egrep "\ s" a.txt ที่ง่ายขึ้น

คำตอบ:


6

หากคุณต้องการ grep เพียงหนึ่งช่องว่างตามที่คุณใส่ไว้ในคำถามของคุณคุณจะใช้สิ่งต่อไปนี้:

grep -e '^\s[^\s]' -e '[^\s]\s$' -e '[^\s]\s[^\s]' a.txt

หรือสำหรับตัวแปร POSIX:

grep -e '^ [^ ]' -e '[^ ] $' -e '[^ ] [^ ]' a.txt

หรือตัวแปร POSIX ที่อ่านได้น้อยลง:

grep '\(^\|[^ ]\)\ \([^ ]\|$)' a.txt

สมมติว่าคุณต้องการยกเว้นบรรทัดที่มีช่องว่างที่อยู่ติดกันมากกว่าหนึ่งช่องสิ่งนี้ต้องมีช่องว่างหนึ่งช่องโดยไม่ต้องนำหน้าด้วยช่องว่างและไม่เว้นวรรคตามด้วยช่องว่าง

นอกจากนี้ยังเป็นที่น่าสังเกตว่าไม่ใช่ทุกรุ่นของ grep สนับสนุนการควบคุมการแสดงออกปกติ '\ s'


1
คุณสามารถละเว้นแบ็กสแลชเหล่านั้นทั้งหมดจากตัวอย่างล่าสุดและปรับปรุงความสามารถในการอ่านโดยใช้-Eตัวเลือกที่ระบุ POSIX ซึ่งเปิดใช้งาน regex ที่ขยายเพิ่ม grep -E '(^|[^ ]) ([^ ]|$)' a.txtไม่ว่าในกรณีใดไม่จำเป็นต้องใช้แบ็กสแลชก่อนช่องว่างและมีสิ่งใดหายไปก่อนที่จะปิดวงเล็บสุดท้าย นอกจากนี้สำหรับรุ่นgrepที่เข้าใจ\sคุณสามารถย่อนิพจน์สำหรับที่ไม่ใช่ที่ว่าง[^\s]ให้\S
หยุดชั่วคราวจนกว่าจะมีประกาศเพิ่มเติม

อย่างไรก็ตามสิ่งนี้ก็ใช้ได้เช่นกัน [[: blank:]]
Emax


1

Variant 2 จะค้นหาช่องว่างสองช่องเท่านั้น หากคุณใช้'\s'แทนทั้งสองรุ่นจะทำงาน

คุณสามารถทดสอบสิ่งนี้ด้วยตัวเองได้ง่ายๆดังนั้นคำถามจริงของคุณคืออะไร


1
เหตุใดจึงค้นหาช่องว่างสองช่องเท่านั้น ฉันคิดว่ามันตรงกับพื้นที่ใด ๆ
cuonglm

1
@Gnouc: Variant 2 ในขณะที่เขา wrotes มันจะตรงกับอย่างน้อยสองช่องว่างในแถวเพราะเขาเพิ่มอักขระช่องว่างหลังจากที่กลุ่มตัวละคร'\s ' \s
สเวน

คุณพูดถูกฉันไม่เห็นช่องว่างหลังจาก\sฉันทำผิด
cuonglm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.