Puncte:4

Utilizarea sed cu o variabilă în interiorul ghilimelelor duble

drapel kr

Am un dosar input.xml care contine o linie: <exciton lambda="1" fix="hole"/>

în acea linie vreau să înlocuiesc 1 cu 2, dar nu pot folosi doar 1 ca cuvânt cheie, deoarece există alte cazuri de „1” în același fișier, așa că trebuie să folosesc cuvântul cheie lambda="1"

Încerc să folosesc comanda sed ca mai jos:

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

Dar nu funcționează, vă poate ajuta cineva.

Puncte:5
drapel cn

Î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

Puncte:2
drapel tj

Încerc să folosesc comanda sed ca mai jos:

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

Presupunând valoare este deja definit, includeți variabila cu ghilimele simple: „$value”:

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

EDITAȚI | × așa cum a arătat @terdon, dacă dvs valoare variabila conține spații albe, cele de mai sus nu vor funcționa și va trebui să citați variabila între ghilimele simple:

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

terdon avatar
drapel cn
Acest lucru va eșua dacă `$value` conține spații albe.Acest lucru se datorează faptului că de fapt nu includeți `$value` între ghilimele simple aici. La urma urmei, variabilele cuprinse între ghilimele simple nu sunt extinse. Ghilimele pur și simplu termină expresia `sed` cu ghilimele simple și încep una nouă. Pentru a face acest lucru în siguranță, aveți nevoie de: `sed -i 's/lambda="1"/lambda="'"$value"'"/g' input.xml`.
fuzzy drawings avatar
drapel tj
OP a indicat că „valoare” ar fi **2** (un alt număr întreg), dar da, va eșua dacă a folosit în schimb o valoare care conține spații albe sau terminații de rând. Cred că trebuie să mă obișnuiesc să folosesc întotdeauna variabile cu ghilimele duble.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.