การแทนที่การเกิดขึ้นครั้งแรกของรูปแบบในบรรทัดสำหรับทุกบรรทัดในไฟล์ที่มี sed


16

เป็นไปได้ที่จะทำในหนึ่งซับ?

ฉันมีผลลัพธ์เช่นนี้

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

อินพุตนี้สร้างขึ้นโดยอัตโนมัติ

ฉันต้องการแทนที่การเกิดขึ้นครั้งแรกของ"(เครื่องหมายคำพูด + ช่องว่าง) ด้วย"(เครื่องหมายคำพูด) สำหรับแต่ละบรรทัด ถ้าฉันใช้การทดแทนทั่วโลกมันก็จะเปลี่ยนทุกอย่างที่เกิดขึ้นline" -เป็นline"-ดังนั้นฉันสงสัยว่ามันเป็นไปได้ที่จะใช้สายการบินเดียวที่จะทำให้สำเร็จ

ฉันได้ลองใช้^แบบนี้

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'

แต่มันไม่ทำงานมันไม่ได้แทนที่อะไรเลย ฉันเหนื่อย

sed -r ':a;N;$!ba;s/(^|\" )/\"/g'

และมันจะแทนที่เหตุการณ์ที่เกิดขึ้นทั้งหมด ฉันเพิ่งเริ่มใช้ sed ดังนั้นฉันไม่รู้จริง ๆ ว่าฉันทำอะไรผิด

ฉันหายไปนี่อะไร


หมายเหตุเกี่ยวกับป้ายกำกับ: คำสั่งที่คุณเขียนด้านบนอาจใช้งานได้ในบางระบบsedแต่เพื่อความสะดวกในการพกพาและเพื่อหลีกเลี่ยงข้อผิดพลาดที่แปลกจริง ๆ คุณควรวางอาร์กิวเมนต์คำสั่งที่กำหนดหลังจากป้ายกำกับ (ถ้าคุณต้องการเลย) เช่นsed -e ':a' -e 'N;$!ba' -e 'whatever'
Wildcard

คำตอบ:


34

คุณคิดมาก sedแทนที่เฉพาะอินสแตนซ์แรกบนบรรทัดตามค่าเริ่มต้น (โดยไม่มี/gตัวแก้ไข) แม้ว่าคุณจะยังต้องการทอดสมอเพราะคุณไม่ต้องการอินสแตนซ์แรกในบรรทัดมากเป็นบรรทัดแรกเมื่อเริ่มต้นบรรทัด และโดยปกติคุณไม่จำเป็นต้องมีการดำเนินการกับบรรทัดอย่างชัดเจนที่คุณพยายามใช้ (เพราะเหตุใด)

sed 's/^" /"/'

ขอบคุณ! ฉันคิดว่ามันเป็นสิ่งจำเป็นที่จะต้องประกาศการกระทำที่ชัดเจนเมื่อทำงานกับไฟล์อ่านเกี่ยวกับมันและใช้ต่อไปเรื่อย ๆ ผมได้รับมากกว่าที่คิดว่าไม่สามารถจะง่ายและมันไม่หลอกลวง :)
สตีฟบี

ฉันอยากจะบอกว่าคำสั่งเหล่านั้นล้าสมัยไปแล้ว มีความเป็นไปได้ที่จะทำสิ่งต่าง ๆ ที่ซับซ้อนหลายอย่างกับพวกมัน แต่มันไม่ง่ายเลยที่จะทำเช่นนั้นและวันนี้คุณก็ดีขึ้นด้วยการใช้ perl / python / ruby ​​/ อะไรก็ตามแทน
geekosaur

ไม่เห็นด้วยอย่างสมบูรณ์กับความคิดเห็นข้างต้น; sedคำสั่งหลายบรรทัดเช่นNและป้ายกำกับเช่น:aไม่ล้าสมัยเลยและมีคำสั่งพกพาและระบุ POSIXซึ่งแตกต่างจาก Perl / Python / Ruby / อะไรก็ตาม มันเป็นความจริง แต่ที่ถ้าคุณพบว่าตัวเองต้องให้พวกเขามักจะคุณควรเรียนรู้ awk
Wildcard

2

คำตอบทั่วไปมากขึ้นเนื่องจากฉันไม่สามารถแสดงความคิดเห็นในคำตอบของ geekosaur - คุณจะไม่ใส่ ^ (จุดเริ่มต้นของบรรทัดสมอ) ตัวอย่างเช่นหากคุณต้องการแทนที่การเกิดขึ้นครั้งแรกของ A ด้วย B คุณจะมี

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