Score:1

ใช้การดำเนินการ sed กับบรรทัดที่ขึ้นต้นด้วยสตริงเฉพาะเท่านั้น

ธง bd

ฉันมีรูปแบบไฟล์ดังต่อไปนี้

ได้รับจาก +11231231234 เวลา 2021-10-10T19:56:50-07:00:
นี่คือข้อความที่มีคำเช่น จาก ที่ ฯลฯ

ส่งไปที่ +11231231234 เวลา 10-11-2021T06:50:57+00:00:
นี่เป็นข้อความอื่นที่มีคำว่า to, at เป็นต้น

ฉันต้องการล้างบรรทัด "รับ" และ "ส่ง" คำสั่ง sed ต่อไปนี้ทำได้

ไฟล์แมว | sed 's/จาก//g' | sed 's/to/ /g' | sed 's/+\w\+//' | \ 
sed 's/ที่//g' | sed 's/T/ /g' | sed 's/[[:หลัก:].]*\:$//' | \ 
sed 's/[[:หลัก:].]*\:$//' | sed 's/-$//' | sed 's/-$//' | sed 's/+$//'

และส่งผลตามมา

ได้รับ 10-10-2021 19:56:50 น
นี่คือข้อความที่มีคำเช่น , , เป็นต้น

ส่ง 2021-10-11 06:50:57
นี่คือข้อความอื่นที่มีคำเช่น , , เป็นต้น

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

tm flag
ข้ามไปที่ [Unix & Linux](https://unix.stackexchange.com/q/679965/13792)
Score:2
ธง in

คุณสามารถใช้รูปแบบเพื่อเลือกบรรทัดที่จะใช้คำสั่งที่ตามมากับ:

sed '/^ส่ง\|^รับ/ s/pattern/replacement/' your_file

โบนัส

คุณสามารถทำการแก้ไขทั้งหมดได้ในคำสั่ง sed อันรุ่งโรจน์เพียงคำสั่งเดียว:

sed '/^รับ\|^ส่ง/ s/\(^[^ ]*\).*ที่ \(.*\)T\(.*\)[-+].*/\1 \2 \3 /' your_file

โดยพื้นฐานแล้วรูปแบบจะตรงกับข้อความทุกบรรทัดในบรรทัดและเราก็แค่ 'จำ' บิตทั้งหมดที่เราต้องการเก็บไว้ จากนั้นแทนที่ทั้งบรรทัดด้วย พวกเขา.

เอาท์พุต:

ได้รับ 10-10-2021 19:56:50 น
นี่คือข้อความที่มีคำเช่น จาก ที่ ฯลฯ

ส่ง 2021-10-11 06:50:57
นี่เป็นข้อความอื่นที่มีคำว่า to, at เป็นต้น

วิธีการทำงานมีดังนี้:

  • \( และ \) เป็น 'แคปเจอร์กรุ๊ป' ที่จดจำสิ่งที่จับคู่ ระหว่างพวกเขา.
  • ^[^ ]* จับคู่จุดเริ่มต้นของบรรทัดตามด้วยจำนวนเท่าใดก็ได้ อักขระที่ไม่ใช่ช่องว่างต่อเนื่องกัน (เช่น คำแรกในบรรทัด)
  • .*ที่ จับคู่ทุกอย่างจนถึงและรวมถึงคำว่า 'at' (และช่องว่าง ต่อไปนี้) - สิ่งนี้ไม่ได้อยู่ในกลุ่มการจับภาพ ดังนั้นจึงไม่ถูก 'จดจำ'
  • \(.*\)ต จดจำ (ในกลุ่มจับภาพที่สอง) ทุกอย่างได้ถึง แต่ไม่ใช่ รวมถึงตัวพิมพ์ใหญ่ 'T'
  • \(.*\)[-+].* จดจำ (ในกลุ่มจับภาพที่สาม) ทุกอย่างได้ถึง แต่ ไม่รวม '-' หรือ '+' (และอะไรก็ตามที่ตามหลัง '-/+')
  • /\1 \2 \3/ หมายถึง แทนที่การแข่งขัน (เช่น ทั้งบรรทัด) ด้วย เนื้อหาของกลุ่มจับภาพที่ 1, 2 และ 3

หน้านี้ อธิบาย sed ดีมาก - นอกจากนี้ยังมีชุดที่ยอดเยี่ยมของ ยูนิกซ์อื่นๆ บทช่วยสอน.

jf4i2d avatar
bd flag
ขอบคุณผู้ชายเซ็กซี่

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา