สิ่งนี้อาจใช้ได้กับคุณ (GNU sed):
sed -r '1{x;s/^/:abbc:bcab/;x};G;s/^/\n/;:a;/\n\n/{P;d};s/\n(ab|bc)(.*\n.*:(\1)([^:]*))/\4\n\2/;ta;s/\n(.)/\1\n/;ta' file
สิ่งนี้ใช้ตารางการค้นหาที่จัดทำและเก็บไว้ในพื้นที่พัก (HS) แล้วต่อท้ายแต่ละบรรทัด เครื่องหมายที่ไม่ซ้ำกัน (ในกรณีนี้\n
) จะถูกนำไปรวมไว้ที่จุดเริ่มต้นของบรรทัดและใช้เป็นวิธีในการค้นหาตลอดความยาวของบรรทัด เมื่อเครื่องหมายมาถึงจุดสิ้นสุดของบรรทัดกระบวนการจะเสร็จสิ้นและจะพิมพ์ตารางการค้นหาและเครื่องหมายที่ถูกทิ้ง
NB ตารางการค้นหาถูกเตรียมไว้ล่วงหน้าตั้งแต่จุดเริ่มต้นและเครื่องหมายที่สองที่ไม่ซ้ำกัน (ในกรณีนี้:
) ถูกเลือกเพื่อไม่ให้ขัดแย้งกับสตริงการแทนที่
ด้วยความคิดเห็นบางส่วน:
sed -r '
# initialize hold with :abbc:bcab
1 {
x
s/^/:abbc:bcab/
x
}
G # append hold to patt (after a \n)
s/^/\n/ # prepend a \n
:a
/\n\n/ {
P # print patt up to first \n
d # delete patt & start next cycle
}
s/\n(ab|bc)(.*\n.*:(\1)([^:]*))/\4\n\2/
ta # goto a if sub occurred
s/\n(.)/\1\n/ # move one char past the first \n
ta # goto a if sub occurred
'
ตารางทำงานดังนี้:
** ** replacement
:abbc:bcab
** ** pattern
g
ธงจากทั้งสองs///
คำสั่งเหล่านั้นและที่จะทำงาน