ตัวเลือก `-n 'ใน sed ทำอะไร


13

นี่คือรายการหน้าคนสำหรับ-n:

-n

ปราบปรามการพิมพ์พื้นที่รูปแบบอัตโนมัติ

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

$ cat test.txt 
first
second
third
fourth
fifth

$ sed -n '2,3p' test.txt 
second
third

$ sed '2,3p' test.txt 
first
second
second
third
third
fourth
fifth

อย่างไรก็ตามกฎหมายนี้ไม่ได้มีไว้สำหรับคำสั่งอื่น ๆ :

$ sed -n 's/t/T/' test.txt 

$ sed 's/t/T/' test.txt 
firsT
second
Third
fourTh
fifTh

แล้วจะ-nทำอะไรกันแน่?

คำตอบ:


17

โดยปกติ sed ประมวลผลแต่ละบรรทัด (ทำการทดแทน ฯลฯ ) จากนั้นพิมพ์ผลลัพธ์ หากการประมวลผลเกี่ยวข้องกับบรรทัดที่พิมพ์ (เช่นpคำสั่งของ sed ) จะได้รับการพิมพ์สองครั้ง (ระหว่างการประมวลผลจากนั้นพิมพ์อีกครั้งโดยการพิมพ์ภายหลังการประมวลผลอัตโนมัติ) -nตัวเลือกปิดการใช้งานการพิมพ์แบบอัตโนมัติซึ่งหมายความว่าสายที่คุณไม่เฉพาะบอกให้พิมพ์ไม่ได้รับการพิมพ์และเส้นคุณไม่ชัดเจนบอกให้พิมพ์ (เช่นกับp) ได้รับการพิมพ์เพียงครั้งเดียว

  • sed -n '2,3p' test.txt - พิมพ์เฉพาะบรรทัดที่ 2 ถึง 3 ตามที่ร้องขอ

  • sed '2,3p' test.txt - พิมพ์แต่ละบรรทัด (โดยอัตโนมัติ) และยังพิมพ์บรรทัด 2-3 ครั้งที่สอง

  • sed -n 's/t/T/' test.txt - แทนที่ "t" ด้วย "T" ในแต่ละบรรทัด แต่ไม่พิมพ์ผลลัพธ์เนื่องจาก -n

  • sed 's/t/T/' test.txt - แทนที่ "t" ด้วย "T" ในแต่ละบรรทัดและพิมพ์ผลลัพธ์โดยอัตโนมัติ

และให้ฉันเพิ่มตัวอย่างเพิ่มเติม:

  • sed -n 's/t/T/p' test.txt - แทนที่ "t" ด้วย "T" ในแต่ละบรรทัดพิมพ์เฉพาะบรรทัดที่มีการแทนที่ (เช่นไม่ใช่ "second")

  • sed 's/t/T/p' test.txt - แทนที่ "t" ด้วย "T" ในแต่ละบรรทัดพิมพ์บรรทัดที่มีการแทนที่จากนั้นพิมพ์แต่ละบรรทัดโดยอัตโนมัติ (ผลลัพธ์: พิมพ์ "วินาที" หนึ่งครั้งและอีกสองบรรทัด)

  • sed '2,3p; 3p' test.txt- พิมพ์บรรทัดที่ 1, 4 และ 5 ครั้งเดียว (พิมพ์อัตโนมัติ); บรรทัดที่ 2 สองครั้ง ( pคำสั่งแรกจากนั้นพิมพ์อัตโนมัติ) และบรรทัดที่สามสามครั้ง (หนึ่งครั้งสำหรับแต่ละpคำสั่งจากนั้นอีกครั้งโดยอัตโนมัติ)


ขอบคุณ Gordon แต่การประเมินของคุณทำซ้ำการสังเกตของฉันเท่านั้น ในตัวอย่างสองตัวอย่างแรกที่ไม่มีการ-nพิมพ์ออกมาทุกบรรทัดนอกเหนือจากบรรทัดที่ร้องขอโดยเฉพาะ ดังนั้นในกรณีที่ไม่ใส่พิมพ์ของทุกสายการแยกวิเคราะห์-n อย่างไรก็ตามในตัวอย่างที่สามและสี่พฤติกรรมนั้นแตกต่างกัน ในกรณีดังกล่าวโดยไม่ต้อง sed -nไม่ออกสายสองครั้งจึงใช้-nไม่ได้ปราบปรามการพิมพ์ของสายการแยกวิเคราะห์ทุกแต่ยับยั้งการพิมพ์ของเส้นที่ไม่ได้เปลี่ยน ฉันมีปัญหาในการพูดคุยทั่วไปเมื่อพฤติกรรมจะเป็นอย่างใดอย่างหนึ่ง
dotancohen

ไม่ในทั้งสองกรณี-nกำลังทำสิ่งเดียวกัน: การสลับจากทุกบรรทัดที่ถูกพิมพ์โดยอัตโนมัติ (และpและpตัวปรับเปลี่ยนเป็นคำสั่งทดแทนจะทำให้บรรทัดนั้นพิมพ์อีกครั้ง) เป็นโหมดที่มีการพิมพ์บรรทัดเฉพาะเมื่อคุณบอกเป็นพิเศษ ถึง (ด้วยpคำสั่ง ฯลฯ )
Gordon Davisson

ลองอีกวิธี: ลองเพิ่ม-nตัวเลือกและเพิ่ม; pไปยังคำสั่ง sed (เช่นsed -n '2,3p; p'และคุณจะได้รับผลลัพธ์เช่นเดียวกับที่คุณไม่มีโดยไม่ใส่การ-nยับยั้งการพิมพ์อัตโนมัติเริ่มต้นและ; pเพิ่มอย่างชัดเจน (ส่วนใหญ่เทียบเท่า ) พิมพ์
Gordon Davisson

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