ฉันจะสร้างบรรทัดคำสั่ง sed จาก diff ได้อย่างไร


0

ฉันรู้ว่า diff -e สามารถส่งออก ed ต้นฉบับ และความเข้าใจของฉันก็คือ ed และ sed แบ่งปันวิธีการของพวกเขา แต่ที่ ed เป็นแบบโต้ตอบและ sed สำหรับสตรีม

สิ่งที่ฉันต้องการจะทำคือเอาท์พุทของ diff -e (หรือการเชิญอื่น ๆ ของ diff ) และลบล้างมันเป็นการร้องขอ sed เช่นการเรียกใช้คำสั่งนั้นด้วยไฟล์ "before" ดั้งเดิมเมื่ออินพุตสร้างเอาต์พุตเทียบเท่ากับไฟล์ "after" จาก diff การภาวนา ฉันต้องการจัดรูปแบบคำสั่งเป็นชุดของ -e <BLERG> ตัวเลือกที่ส่งไปยัง sed เพื่อหลีกเลี่ยงการต้องเขียนสคริปต์ ed / sed ไปยังไฟล์อื่น

ฉันลองชุด mungings ที่เห็นได้ชัด แต่ฉันไม่ได้รับผลลัพธ์ที่ต้องการ (หรือดูสมเหตุสมผล) และฉันคิดว่าฉันขาดอะไรบางอย่างที่ครอบคลุม เป็นไปได้ไหม


มันจะต้องมี sed?
Paul

ฉันคิดว่าไม่มันไม่จำเป็นต้องเป็น
ipmcc

แต่ฉันต้องการใช้ในบริบทการสตรีมเช่น: curl -s http://someurl.com | [Command I'm looking for] > outputFile ดังนั้น sed ดูเหมือนจะเป็นทางเลือกที่เป็นธรรมชาติ
ipmcc

คำตอบ:


4

คุณสามารถติดกับ ed: สมมติว่าคุณต้องการ diff file1 และ file2 จากนั้นใช้การเปลี่ยนแปลงกับ file1 และเขียนลงในไฟล์ชื่อ file1.b:

{ diff -e file1 file2; echo "w file1.b"; echo q; } | ed file1

ตอนนี้ไม่ควรมีความแตกต่างระหว่าง file2 และ file1.b:

$ diff file2 file1.b && echo "no diff"
no diff

ฉันคิดว่าคุณกำลังอยู่ในเส้นทางที่ถูกต้อง แต่ปัญหาของการแก้ไขนี้คือมันต้องมีไฟล์ 2 อยู่ก่อน สถานการณ์ที่ฉันอยู่คือ file1 พร้อมใช้งานเสมอ ฉันสร้าง file2 ด้วยการแก้ไขด้วยมือไปที่ file1 แต่ file2 ถูกลบออกจากใต้ฉันเป็นระยะดังนั้นวัตถุคือการสร้างไพพ์ไลน์คำสั่งที่ฉัน cat file1 | [Command I'm looking for] > file2 เพื่อสร้าง file2 ใหม่ตามต้องการ
ipmcc

@ipmcc - คุณไม่จำเป็นต้องใช้ file2; หากคุณมีสคริปต์ใช้ cat script แทน diff... หรือฝังสคริปต์ของคุณใน heredoc และส่งต่อไปยัง ed -s file1<<... แต่จริงๆแล้วคำถามของคุณไม่สมเหตุสมผล อัลกอริทึมที่ใช้โดย diff -e มันโง่จริงๆ หากคุณต้องแทนที่ "foo" สิบรายการที่มีมากกว่า 40 บรรทัดด้วย "bar" จะเป็นการลบบล็อก 40 บรรทัดและผนวกบล็อกใหม่ 40 บรรทัดแทนการทำง่ายๆ 15,55s/foo/bar/g. และถ้าคุณพยายามทำให้มันใช้งานได้ด้วย sed คุณจะใช้เวลามากขึ้นในการแปลง (เพราะ ed ทำงานย้อนหลัง) มากกว่าเขียนของคุณเอง
don_crissti

1

diff และแอปพลิเคชั่นที่ตามมาของ diff ความแตกต่างในเวลาที่ต่างกัน สมมติว่าคุณมีผลลัพธ์จากคุณ diffฉันจะใช้ patch:

diff -u original.html new.html & gt; original.patch

จากนั้นในตอนท้ายที่ได้รับ:

curl -s http://someurl.com > original.html; patch < original.patch

นี่หมายความว่าวิศวกรรมชื่อไฟล์ของคุณจะเหมือนกันเนื่องจากมีอยู่ในไฟล์แพตช์

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