จะทำให้ sed ไม่ตัดบรรทัดที่ไม่ตรงกันได้อย่างไร


8

ในตัวอย่างต่อไปนี้sedจับคู่บรรทัดที่ขึ้นต้นด้วยaหรือหรือcและพิมพ์อักขระตัวแรกของบรรทัดนั้น ( aหรือc):

$ echo "ag
bh
ci
dj
ek
fl" | sed 's/\(a\|c\)./\1/' # Matches lines starting with 'a' or 'c'.

output:
a
bh
c
dj
ek
fl

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

$ echo "ag
bh
ci
dj
ek
fl" | grep '[ac]' | sed 's/\(a\|c\)./\1/'

output:
a
c

มันไม่สำคัญสำหรับสิ่งที่คุณอยากรู้ แต่รูปแบบของคุณควรเริ่มต้นด้วย ^ ดังนั้นมันจึงยึดกับจุดเริ่มต้นของบรรทัด ตามรหัสแล้วมันจะจับคู่ a หรือ c ที่ใดก็ได้ในบรรทัดตราบใดที่ไม่ใช่อักขระตัวสุดท้าย
Joe

คำตอบ:


12

ใช้no-printแฟล็ก ( -n) และพิมพ์คำสั่งทดแทนที่ประสบความสำเร็จ ( s///p):

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