แทนที่การเว้นวรรคสองครั้งทั้งหมดหลังจากสิ้นสุดประโยคด้วยช่องว่างเดียว


9

ฉันติดอยู่รวมทั้งการแสดงออกปกติด้วยคำสั่ง sed

ถาม:ฉันต้องการแทนที่การเว้นวรรคสองครั้งหลังจากสิ้นสุดประโยคด้วยการเว้นวรรคหนึ่งครั้ง

นี่คือสิ่งที่ฉันทำ:

sed 's/^ $/^$/' file  

และมันไม่ได้แทนที่ช่องว่างสองช่องด้วยช่องว่างหนึ่งช่องหลังจากประโยคสิ้นสุด

เอาท์พุทที่ฉันได้รับ:

This is the output.  Hello Hello

ผลลัพธ์ที่ฉันต้องการ:

This is the output. Hello Hello

@Rahul ฉันต้องการผลลัพธ์ที่มีครั้งเดียวช่องว่างหลังจากประโยคสิ้นสุด ไม่ใช่ช่องว่างสองช่องเหมือนกับในประโยคแรก ฉันต้องการผลลัพธ์ประโยคที่สอง
Zeus

คำตอบโดย @Jasen ถูกต้อง BTW คำสั่งที่คุณพยายามหมายถึง: แทนที่บรรทัดที่มีเพียงช่องว่างเดียวโดยบรรทัดว่าง นี่คือเหตุผลที่มันไม่ได้ทำในสิ่งที่คุณต้องการ
rexkogitans

1
แทรกที่นี่: สงครามกับพื้นที่เดี่ยวและสองครั้งหลังจากหยุดเต็ม
gerrit

@gerrit สงครามนั้นหายไปเมื่อ 20 ปีก่อน ;)
h4ckNinja

คำตอบ:


12
 sed 's/\.   */. /g' < file

แทนที่จุดตามด้วยช่องว่างสองจุดขึ้นไปด้วยจุดตามด้วยช่องว่างเดียว


คำสั่งของคุณใช้งานได้จริงทั้งย่อหน้า นั่นคือสิ่งที่ฉันต้องการ ขอบคุณ!
Zeus

หรือsed -r 's/\.\s+/. /g' fileกับ GNU sed ...
Sundeep

ใช้ @spasic มากกว่าsed -E sed -rใช้งานได้กับ GNU sed และ * BSD sed (รวมถึง Mac OS X) และอื่น ๆ กำหนดให้รวมเป็นมาตรฐานใน POSIX "จริงเร็ว ๆ นี้"
cas

@cas ฉันจำได้ว่าบางครั้งฉันแนะนำsed -Eให้ใครบางคนในเว็บไซต์นี้ซึ่งใช้งานไม่ได้ แต่sed -rทำงาน .. ฉันทำงานกับ GNU เพียงอย่างเดียวดังนั้นจึงไม่มีความคิดเกี่ยวกับ POSIX และรูปแบบอื่น ๆ .. จะพยายามรวมรายละเอียดนี้ในอนาคต ขอบคุณ :)
Sundeep

มันต้องเป็นรุ่นเก่าของ GNU sed พวกเขาได้รับการสนับสนุน-Eสำหรับค่อนข้างขณะนี้ (อย่างน้อยตั้งแต่ปี 2011 แต่คนและข้อมูลหน้ายังคงพูดถึงเพียง-r)
CAS

13

sedคำสั่งของคุณ's/^ $/^$/'จะไม่ทำสิ่งที่คุณต้องการ ^$มันก็เปลี่ยนทุกบรรทัดมีหนึ่งในพื้นที่ที่มีเส้นมี

ขึ้นอยู่กับสิ่งที่ตัวละครทำเครื่องหมายจุดสิ้นสุดของประโยคคุณสามารถทำ:

sed -e 's/\([.?!]\) \{2,\}/\1 /g' <file

สิ่งนี้จะแทนที่ช่องว่าง 2 หลัง.ขึ้นไป?หรือ!ด้วยช่องว่างเดียวเท่านั้น


1
สามารถย่อให้เหลือsed -r 's/([.?!])\s+/\1 /g' file
Sundeep

ขอบคุณ แต่คุณจะอธิบายอย่างละเอียดไหมว่าทำไมคุณจึงใช้วงเล็บเหลี่ยมทรงกลมหลายอัน มันสับสนเล็กน้อย
ซุส

1
@spasic: ใช้งานได้กับ GNU เท่านั้นเท่านั้นอัปเดตด้วยเวอร์ชันที่ง่ายขึ้น
cuonglm

@Zeus: นั่นคือไวยากรณ์มาตรฐานพร้อม BRE เริ่มต้น
cuonglm

1
ไม่มีต้นฉบับsedสคริปต์การแก้ไขจะแทนที่บรรทัดใด ๆ ^$ที่มีพื้นที่เดียวกับสตริงตัวอักษร
Kusalananda

7

นี่คือสิ่งที่คุณอาจมองหา

tr -s " " <filename

ตัวอย่าง,

$ echo "This is the output.  Hello Hello" | tr -s "[:blank:]"
This is the output. Hello Hello

การใช้sed,

$ echo "This is the output.  Hello Hello" | sed 's/\. \+/. /g'
$ echo "This is the output.  Hello Hello" | sed 's/\. \{1,\}/. /g'
This is the output. Hello Hello

2
มันใช้งานได้ดี แต่ฉันต้องรวมคำสั่ง sed กรุณาบอกบางสิ่งที่คล้ายกับที่แสดงด้านบนเช่นการทดแทนเปลี่ยนข้อความ ฯลฯ ใน sed
ซุส

2
ฉันไม่ได้ตระหนักถึงคุณลักษณะนี้ tr,
Jasen

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