คุณดูสับสนเล็กน้อยเกี่ยวกับวิธีการทำงานของ sed ดังนั้นฉันจะไปทีละขั้นตอน ของฉัน
'คำตอบ' คือ:
s="col(3,B,14)"; เสียงสะท้อน $s | sed 's/\(col([0-9],[A-Z],\)/\1t/g'
คำอธิบาย
มีปัญหาสองสามข้อที่นี่ ก่อนอื่นคุณต้องมีเครื่องหมายอัฒภาค
กำหนดตัวแปร 's' ของคุณก่อนที่จะสะท้อนกลับ
s="col(3,B,14)"; เสียงสะท้อน $s
ถัดไป การแทนที่ sed ทำงานโดย 's/pattern/replacement/' - โดยที่ 'pattern' คือ
นิพจน์ทั่วไป แต่ที่ 'การแทนที่' ไม่ใช่ นั่นคือการวางบางสิ่งบางอย่าง
เช่น '[0-9]' ในการแทนที่จะไม่แทนตัวเลขใดๆ แต่แทน
เป็นตัวแทนของห้าอักขระ: [
, 0
, -
, 9
, และ ]
. อีกทั้ง /ก
ที่
สิ้นสุดหมายถึงการใช้การแทนที่ในสตริงสำหรับทุกการแข่งขันของ
รูปแบบ (ดังนั้นหากคุณมีเส้นเช่น ก้อง สวัสดีชาวโลก | sed 's/o/z/g'
แล้ว
ผลลัพธ์จะเป็น 'hellz wzrld' ในทางตรงกันข้าม ก้อง สวัสดีชาวโลก | sed 's/o/z/'
จะให้ 'โลกนรก')
ดังนั้นมาลบการแทนที่ของคุณในตอนนี้:
s="col(3,B,14)"; เสียงสะท้อน $s | sed 's/col([0-9],[A-Z],[0-9])/replacement/g'
หันไปสนใจรูปแบบนิพจน์ทั่วไปที่คุณใช้ มันบอกว่าตรงกับ a
สตริงเช่น 'col(<single digit>,<uppercase letter>,<single digit>)' - ประกาศ
ที่สุดท้าย [0-9]
ชิ้นจะไม่ตรงกับ '14' เนื่องจากเป็นตัวเลขสองหลักเป็นต้น
รูปแบบของคุณจะตรงกับคำว่า 'col(3,B,1)' แต่จะไม่ตรงกับ 'col(3,B14)' ถึง
จับคู่หนึ่งหลักขึ้นไปคุณสามารถใช้ [0-9][0-9]*
:
ในการแทนที่ตามที่คุณต้องการ วิธีที่ดีที่สุดคือใช้ 'capture'
กลุ่ม'. จับภาพกลุ่ม 'จดจำ' ส่วนหนึ่งของการแข่งขันเพื่อใช้ในภายหลัง คุณใส่ \(
และ \)
รอบส่วนของรูปแบบที่ต้องการจำและนำไปใช้ \1
ถึง
อ้างถึงในภายหลัง:
s="col(3,B,14)"; เสียงสะท้อน $s | sed 's/\(col([0-9],[A-Z],\)/\1แทนที่/g'
สิ่งนี้จะจับคู่ 'col(<single digit>,<uppercase letter>,' - จนถึง และ
รวมถึงจุดที่คุณต้องการเพิ่ม 't' สิ่งที่ตรงกันทั้งหมดนี้จะ
ให้ใส่กลับเข้าไปแทน (\1
) ตามด้วยข้อความใด ๆ ที่คุณเพิ่ม (ในนี้
ในกรณีที่เรากำลังเพิ่มข้อความตัวอักษร 'replacement') ข้อความใด ๆ ที่เหลืออยู่ไม่
ที่ตรงกันในการป้อนข้อมูลจะไม่ได้รับผลกระทบ ด้านบนจะแสดงผล:
col(3,B,1replacement4)
ดังนั้นถ้าเราใส่ 't' ในสตริงการแทนที่:
s="col(3,B,14)"; เสียงสะท้อน $s | sed 's/\(col([0-9],[A-Z],\)/\1t/g'
เราได้รับ:
คอลัมน์(3,B,t14)
หากคุณต้องการเรียน sed ให้ดี ฉันขอแนะนำอันที่ยอดเยี่ยม กวดวิชา.