În primul rând, este niciodata o idee buna pentru a încerca să analizeze XML sau alt astfel de text structurat cu expresii regulate. Deși teoretic este posibil să faci bine și în siguranță, este extrem de greu chiar și pentru experți. Mult mai bine să folosești un instrument dedicat care este conceput pentru a gestiona limba pe care o ai. Deci, dacă acesta este un fișier XML, puteți folosi ceva de genul xmlstarlet
in schimb. De exemplu, având în vedere acest fișier de intrare:
$ cat file.xml
<?xml version="1.0"?>
<record id="1">
<exciton lambda="1" fix="hole"/>
</record>
Ai putea face:
$ value="1234"
$ xml ed -u „//record[@id=1]/exciton/@lambda” -v „$value” fișier.xml
<?xml version="1.0"?>
<record id="1">
<exciton lambda="1234" fix="hole"/>
</record>
Toate acestea fiind spuse, cu informațiile foarte minime pe care ni le-ați oferit, este posibil să o puteți face folosind un parser simplu și naiv precum sed
. Există diverse trucuri pe care le puteți încerca. Mai întâi, scăpați de ghilimele duble:
$ sed "s/lambda=\"1\"/lambda=\"$value\"/" file.xml
<?xml version="1.0"?>
<record id="1">
<exciton lambda="1234" fix="hole"/>
</record>
Sau, utilizați ghilimele simple, dar terminați-le și introduceți variabila citată în afara ghilimelelor simple. Apoi, deschideți un nou ghilimele simple pentru a continua sed
expresie:
$ sed 's/lambda="1"/lambda="'"$value"'"/' file.xml
<?xml version="1.0"?>
<record id="1">
<exciton lambda="1234" fix="hole"/>
</record>
Acesta este puțin greu de analizat vizual, dar asta face cu spațiu alb adăugat pentru lizibilitate (rețineți că de fapt nu funcționează cu spațiul alb adăugat, acesta este doar pentru claritate):
sed 's/lambda="1"/lambda="' "$value" '"/' file.xml
Aveți două opțiuni. În primul rând, poți pur și simplu scăpa de dublu