Score:1

Sed เพื่อแทนที่สตริงย่อยภายในสตริงที่มีรูปแบบ

ธง in

ฉันกำลังพยายามแทนที่ส่วนหนึ่งของรูปแบบ เช่น ถ้าฉันมี คอลัมน์(3,B,14), หลังจากสมัคร เสด คำสั่ง ฉันต้องการที่จะได้รับ คอลัมน์(3,B,t14) ซึ่งเพิ่ม ที อักขระไปยังพารามิเตอร์ที่สามในรูปแบบ

ฉันกำลังพยายามด้วย:

s="col(3,B,14)"
เสียงสะท้อน $s | sed 's/col([0-9],[A-Z],[0-9])/col([0-9],[A-Z],t[0-9])/g'

แต่จะคืนสตริงเดิม ฉันจะขอบคุณถ้าคุณสามารถให้คำแนะนำ ขอบคุณ.

FedKad avatar
cn flag
คุณควรใช้การอ้างอิงย้อนกลับในสตริงการแทนที่: https://www.gnu.org/software/sed/manual/html_node/Back_002dreferences-and-Subexpressions.html
CGeorgi avatar
in flag
ขอบคุณ FedonKadifeli ใช่ ฉันทำตามคำแนะนำของคุณและพบวิธีแก้ปัญหา : echo $s | sed -E 's/col(\(.*),(.*),(.*)\)/col\1,\2,t\3)/g' โดยใช้การอ้างอิงด้านหลังตามที่คุณแนะนำ ขอขอบคุณเป็นอย่างมาก.
Score:4
ธง in

คุณดูสับสนเล็กน้อยเกี่ยวกับวิธีการทำงานของ 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 ให้ดี ฉันขอแนะนำอันที่ยอดเยี่ยม กวดวิชา.

CGeorgi avatar
in flag
ขอบคุณมาก mattb สำหรับคำอธิบายโดยละเอียด ฉันจะอ่านบทช่วยสอนอย่างแน่นอน
Score:-2
ธง in

เสียงสะท้อน $s | sed -E 's/col(\(.*),(.*),(.*)\)/col\1,\2,t\3)/g'

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา