ฉันมีไฟล์ที่มีเนื้อหาดังต่อไปนี้:
<username><![CDATA[name]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[name]]></dbname>
และฉันต้องสร้างสคริปต์ที่เปลี่ยน "ชื่อ" ในบรรทัดแรกเป็น "บางอย่าง", "รหัสผ่าน" ในบรรทัดที่สองเป็น "someelse" และ "ชื่อ" ในบรรทัดที่สามเป็น "somethingdifferent" ฉันไม่สามารถพึ่งพาลำดับของสิ่งที่เกิดขึ้นเหล่านี้ในไฟล์ดังนั้นฉันจึงไม่สามารถแทนที่ "ชื่อ" ด้วย "บางอย่าง" เป็นครั้งแรกและเกิดขึ้นเป็นครั้งที่สองของ "ชื่อ" ด้วย "somethingdifferent" ฉันต้องค้นหาสตริงโดยรอบเพื่อให้แน่ใจว่าฉันค้นหาและแทนที่สิ่งที่ถูกต้อง
จนถึงตอนนี้ฉันได้ลองคำสั่งนี้เพื่อค้นหาและแทนที่เหตุการณ์ "ชื่อ" แรก:
sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml
อย่างไรก็ตามมันไม่ทำงานดังนั้นฉันจึงคิดว่าตัวละครบางตัวอาจต้องหลบหนี ฯลฯ
โดยหลักการแล้วฉันยินดีที่จะใช้ regex เพียงแค่จับคู่ "ชื่อผู้ใช้" สองครั้งและแทนที่ "ชื่อ" เท่านั้น บางอย่างเช่นนี้ แต่ด้วยsed
:
<username>.+?(name).+?</username>
และแทนที่เนื้อหาในวงเล็บด้วย "บางอย่าง"
เป็นไปได้ไหม