แทนที่ข้อความด้วย sed และเก็บส่วนหนึ่งของข้อความต้นฉบับ


20

ฉันพยายามแปลง

<id>1</id>
<Name>ENTERPRISE RESOURCE PLANNING</Name>

ไปที่:

<column name="id">1</column>
<column name="Name">ENTERPRISE RESOURCE PLANNING</column>

ฉันกำลังสมมติว่าเครื่องมือที่ดีที่สุดสำหรับงานจะเป็นsedอย่างไร แต่ฉันไม่สามารถหาวิธีที่จะเก็บส่วนของข้อความต้นฉบับในส่วนแทนที่

ถ้าฉันทำ:

$ sed -i 's/<.*>.*<.*>/<column name="\\1">\\2<\/column>/g' filename.xml

ผลลัพธ์คือ:

<column name="\1">\2</column>
<column name="\1">\2</column>

หรือทำคล้ายกันจากภายในviมันจะออกผลลัพธ์:

<column name=""></column>
<column name=""></column>

ฉันจะทำให้เป็นเช่นนั้นได้\1และ\2เปลี่ยนกลับไปเป็นค่าดั้งเดิมได้อย่างไร

คำตอบ:


21

คุณสามารถใช้กลุ่มเช่น:

$ sed -i 's/<\(.*\)>\(.*\)<.*>/<column name="\1">\2<\/column>/g' filename.xml

อาจเป็นส่วนที่สับสนมากที่สุดเกี่ยวกับ REs ก็คือมีรสชาติที่หลากหลายของวากยสัมพันธ์

ตัวอย่างเช่น sed และ vim ใช้นิพจน์ทั่วไปพื้นฐานที่คุณต้องอ้าง()เพื่อรับเมตาความหมาย

ด้วยการแสดงออกปกติเพิ่มเติม (เช่น awk, egrep และน้อยกว่า) คุณจะต้องพูด()เพื่อให้ได้ความหมายที่แท้จริง มีความแตกต่างที่คล้ายกันสำหรับเมตาอักขระอื่น ๆ

เหตุผลที่อยู่เบื้องหลัง()ความหมายของBRE คือเมื่อข้อมูลส่วนใหญ่ของคุณเป็น C-Code คุณจะต้องอ้างเครื่องหมายวงเล็บสำหรับการใช้เมตา


นี่เป็นสิ่งแรกที่ฉันพยายาม แต่ฉันไม่ได้หลบหนี(และ)ตัวละคร คำถามโง่ ๆ แต่ทำไมถึงจำเป็น?
Mike

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