Score:4

การใช้ sed กับตัวแปรภายใน double quote

ธง kr

ฉันมีไฟล์ อินพุต. xml ซึ่งมีบรรทัด: <exciton lambda="1" fix="hole"/>

ในบรรทัดนั้นฉันต้องการแทนที่ 1 ด้วย 2 แต่ฉันใช้ไม่ได้ 1 เป็นคำสำคัญเนื่องจากมี "1" อื่นในไฟล์เดียวกันดังนั้นฉันจึงต้องใช้คำหลัก แลมบ์ดา = "1"

ฉันพยายามใช้คำสั่ง sed ดังต่อไปนี้:

sed -i "s/lambda="1"/lambda="$value"/g" input.xml

แต่มันไม่ทำงาน ใครสามารถช่วยได้โปรด

Score:5
ธง cn

ประการแรกก็คือ ไม่เคยเป็นความคิดที่ดี เพื่อพยายามแยกวิเคราะห์ 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

คุณมีสองทางเลือก ขั้นแรก คุณสามารถหลบหนีจากสองเท่าได้

Score:2
ธง tj

ฉันพยายามใช้คำสั่ง sed ดังต่อไปนี้:

sed -i "s/lambda="1"/lambda="$value"/g" input.xml

ทะลึ่ง ค่า ถูกกำหนดไว้แล้ว ให้ใส่ตัวแปรด้วยเครื่องหมายอัญประกาศเดี่ยว: 'มูลค่า $':

sed -i 's/lambda="1"/lambda="'$value'"/g' input.xml

แก้ไข ตามที่ @terdon ชี้ไป ถ้าคุณ ค่า ตัวแปรมีช่องว่างด้านบนจะไม่ทำงาน และคุณจะต้องใส่เครื่องหมายคำพูดตัวแปรสองครั้งภายในเครื่องหมายคำพูดเดียว:

sed -i 's/lambda="1"/lambda="'"มูลค่า $"'"/g' อินพุต.xml

terdon avatar
cn flag
สิ่งนี้จะล้มเหลวหาก `$value` มีช่องว่างนี่เป็นเพราะคุณไม่ได้ใส่ `$value` ในเครื่องหมายคำพูดเดี่ยวที่นี่ ท้ายที่สุดแล้ว ตัวแปรที่อยู่ในเครื่องหมายคำพูดเดี่ยวจะไม่ถูกขยาย เครื่องหมายคำพูดจะจบนิพจน์ `sed` ที่ยกมาเดี่ยวแล้วเริ่มนิพจน์ใหม่ เพื่อให้ปลอดภัย คุณต้องมี: `sed -i 's/lambda="1"/lambda="'"$value"'"/g' input.xml`
fuzzy drawings avatar
tj flag
OP ระบุว่า `value` จะเป็น **2** (จำนวนเต็มอื่น) แต่ใช่ มันจะล้มเหลวหากเขาใช้ค่าที่มีช่องว่างหรือลงท้ายบรรทัดแทน ฉันเดาว่าฉันต้องทำนิสัยในการใช้ตัวแปรแบบ double-quoted เสมอ

โพสต์คำตอบ

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