ประการแรกก็คือ ไม่เคยเป็นความคิดที่ดี เพื่อพยายามแยกวิเคราะห์ XML หรือข้อความที่มีโครงสร้างดังกล่าวด้วยนิพจน์ทั่วไป แม้ว่าในทางทฤษฎีจะทำได้ดีและปลอดภัยก็เป็นได้ ยากมากแม้แต่กับผู้เชี่ยวชาญ. ดีกว่ามากที่จะใช้เครื่องมือเฉพาะที่ออกแบบมาเพื่อจัดการกับภาษาที่คุณมี ดังนั้นหากนี่เป็นไฟล์ XML คุณสามารถใช้สิ่งที่ต้องการได้ xmlstarlet
แทน. ตัวอย่างเช่น กำหนดไฟล์อินพุตนี้:
ไฟล์แมว $.xml
<?xml version="1.0"?>
<รหัสบันทึก="1">
<exciton lambda="1" fix="hole"/>
</บันทึก>
คุณสามารถทำได้:
มูลค่า $ = "1234"
$ xml ed -u "//record[@id=1]/exciton/@lambda" -v "$value" file.xml
<?xml version="1.0"?>
<รหัสบันทึก="1">
<exciton lambda="1234" fix="hole"/>
</บันทึก>
ทั้งหมดที่กล่าวมา ด้วยข้อมูลเพียงเล็กน้อยที่คุณให้เรามา คุณสามารถทำได้โดยใช้โปรแกรมแยกวิเคราะห์ที่เรียบง่ายและไร้เดียงสาอย่างเช่น เสด
. มีเคล็ดลับมากมายที่คุณสามารถลองได้ ขั้นแรก ให้หลีกเลี่ยงเครื่องหมายอัญประกาศคู่:
$ sed "s/lambda=\"1\"/lambda=\"$value\"/" file.xml
<?xml version="1.0"?>
<รหัสบันทึก="1">
<exciton lambda="1234" fix="hole"/>
</บันทึก>
หรือใช้เครื่องหมายอัญประกาศเดี่ยวแต่จบและใส่ตัวแปรที่มีเครื่องหมายอัญประกาศไว้นอกเครื่องหมายอัญประกาศเดี่ยว จากนั้นเปิด single quotes sting ใหม่เพื่อดำเนินการต่อ เสด
การแสดงออก:
$ sed 's/lambda="1"/lambda="'"$value"'"/' file.xml
<?xml version="1.0"?>
<รหัสบันทึก="1">
<exciton lambda="1234" fix="hole"/>
</บันทึก>
อันนั้นค่อนข้างยากที่จะแยกวิเคราะห์ด้วยสายตา แต่นี่คือสิ่งที่มันทำกับการเพิ่มช่องว่างเพื่อความชัดเจน (โปรดทราบว่ามันไม่ได้ผลจริง ๆ กับช่องว่างที่เพิ่มขึ้น นี่เป็นเพียงเพื่อความชัดเจนเท่านั้น):
sed 's/lambda="1"/lambda="' "$value" '"/' file.xml
คุณมีสองทางเลือก ขั้นแรก คุณสามารถหลบหนีจากสองเท่าได้