Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Alt "Utilizator nou" pe T...

ULBS INFORMATICA

Index preturi

Boxa membrana tweeter infundata
 Am nevoie de poze cu un curcubeu

Whisky for Mac

Xiaomi 14 Gpay

Izolare zid exterior de scandura
 Dezinstalare drivere W11 23H3

Recomandare masina de spalat fiab...

BSOD din cauza Intel Audio DSP dr...

De ce sunt oamenii nostalgici
 Cum vand casa fara factura Hidroe...

Scor FICO minim

Tonometru compensat CAS?

polita RCA ONLINE
 

xml+regex durere de cap

- - - - -
  • Please log in to reply
11 replies to this topic

#1
valeriux1

valeriux1

    New Member

  • Grup: Candidate Members
  • Posts: 9
  • Înscris: 07.06.2021
Salut comunitate! Ajutati-ma va rog sa rezolv urmatoarea problema.
Am asa o portiune de xml:
<PackageReference Include="Test1">
	  <Version>2.1.3</Version>
</PackageReference>
<PackageReference Include="Test2">
	  <Version>4.7.1</Version>
	</PackageReference>


Am nevoie sa inlocuiesc valoarea lui Version of Test1 cu o valoare custom folosind bash.
Am ales sa o fac prin sed, arata cam asa
sed -i '' 's#<Version>\([^<][^<]*\)</Version>#<Version>'$variable'</Version>#' ../../sdk/Somefolder/Somefile.csproj

Dar funcitoneaza numai daca am 1 singur tag Version in fisier. Cum sa leg acest sed  anume de  Version pentru<PackageReference Include="Test1">. ?

#2
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
XML + Regex = https://stackoverflo...-contained-tags

De evitat

#3
valeriux1

valeriux1

    New Member

  • Grup: Candidate Members
  • Posts: 9
  • Înscris: 07.06.2021
Vre-un exemplu / idee cum as putea sa fac asta in bash?

Edited by Dany_Darke, 14 January 2022 - 15:57.


#4
pingutux

pingutux

    New Member

  • Grup: Candidate Members
  • Posts: 3
  • Înscris: 09.12.2021
Inteleg ca vrei sa faca replace si daca ai mai multe aparitii de <Version> in acelasi fisier?

Dacă asta e problema, atunci adaugă un g (global) dupa ultimul # din replace-ul de la sed.

Adica:

sed -i '' 's#<Version>\([^<][^<]*\)</Version>#<Version>'$variable'</Version>#g' fisier

#5
valeriux1

valeriux1

    New Member

  • Grup: Candidate Members
  • Posts: 9
  • Înscris: 07.06.2021
ai dreptate am mai multe de version de asta as fi vrut sa il leg cumva de atributul Include din PackageReference.
Am gasit o solutie sa obtin valoarea, acum trebuie doar sa fac replace.
xpath -e 'string(.//PackageReference[@Include="Refit"]/Version/text()' old.xml > new.xml


Edited by Dany_Darke, 14 January 2022 - 18:40.
nu mai cita inutil


#6
pingutux

pingutux

    New Member

  • Grup: Candidate Members
  • Posts: 3
  • Înscris: 09.12.2021
In sed nu stiu daca reusesti, am impresia ca citeste line by line si nu cred ca il poti forta sa faca altfel.
Tu ai nevoie sa legi de tagul X indiferent daca e pe aceeasi linie sau pe alta si deci regexul trebuie sa fie multilinie.

Ai putea face cu perl, cam asa:

variable="blabla"; perl -s -pi -e "BEGIN{undef $/} ; s/(<PackageReference Include=\"Test1\">\s+<Version>)[^<]+(<\/Version>)/\1${var}\2/smg" -- -var="$variable"	file_name


Inlocuiesti variable="blabla" cu definitia ta si lui perl ii zici sa puna in variabila lui var ce ai in variabila din bash.

Fa si tu un backup inainte, sa nu iasa vreo duda. :-)

#7
valeriux1

valeriux1

    New Member

  • Grup: Candidate Members
  • Posts: 9
  • Înscris: 07.06.2021
Imi goleste valoarea din <Versions></Versions>

Edited by Dany_Darke, 14 January 2022 - 18:40.
nu mai cita inutil


#8
Bitterblue

Bitterblue

    Member

  • Grup: Members
  • Posts: 398
  • Înscris: 25.02.2020
Dacă Python e disponibil, folosește lxml și nu te mai chinui cu regex.

Sau văd că Python are și ceva integrat și nu trebuie lxml: https://docs.python....lementtree.html

#9
pingutux

pingutux

    New Member

  • Grup: Candidate Members
  • Posts: 3
  • Înscris: 09.12.2021

 valeriux1, on 14 ianuarie 2022 - 17:50, said:

Imi goleste valoarea din <Versions></Versions>

Inseamna ca valoarea lui $variable e nula. Cum aloci valoare pentru variable ala?

#10
valeriux1

valeriux1

    New Member

  • Grup: Candidate Members
  • Posts: 9
  • Înscris: 07.06.2021

 pingutux, on 14 ianuarie 2022 - 19:51, said:

Inseamna ca valoarea lui $variable e nula. Cum aloci valoare pentru variable ala?

am alocat standard,  uite aici:
valeriu.sova@ias-mb-089 FodySampleApp % cat old.xml
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PackageReference Include="Test1">
	<Version>2.2.1</Version>
  </PackageReference>
  <PackageReference Include="Test2">
	<Version>4.7.1</Version>
  </PackageReference>
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>%	
																																																															  valeriu.sova@ias-mb-089 FodySampleApp % variable=0.0.0
valeriu.sova@ias-mb-089 FodySampleApp % perl -s -pi -e "BEGIN{undef $/} ; s/(<PackageReference Include=\"Test1\">\s+<Version>)[^<]+(<\/Version>)/\1${var}\2/smg" -- -v="$variable" old.xml
valeriu.sova@ias-mb-089 FodySampleApp % cat old.xml
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PackageReference Include="Test1">
	<Version></Version>
  </PackageReference>
  <PackageReference Include="Test2">
	<Version>4.7.1</Version>
  </PackageReference>
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>																																																															  valeriu.sova@ias-mb-089 FodySampleApp %


 pingutux, on 14 ianuarie 2022 - 17:42, said:

In sed nu stiu daca reusesti, am impresia ca citeste line by line si nu cred ca il poti forta sa faca altfel.
Tu ai nevoie sa legi de tagul X indiferent daca e pe aceeasi linie sau pe alta si deci regexul trebuie sa fie multilinie.

Ai putea face cu perl, cam asa:

variable="blabla"; perl -s -pi -e "BEGIN{undef $/} ; s/(<PackageReference Include=\"Test1\">\s+<Version>)[^<]+(<\/Version>)/\1${var}\2/smg" -- -var="$variable" file_name


Inlocuiesti variable="blabla" cu definitia ta si lui perl ii zici sa puna in variabila lui var ce ai in variabila din bash.

Fa si tu un backup inainte, sa nu iasa vreo duda. :-)

A mers, doar am inlocuit " cu '. Merci mult de ajutor.

#11
valeriux1

valeriux1

    New Member

  • Grup: Candidate Members
  • Posts: 9
  • Înscris: 07.06.2021

 pingutux, on 14 ianuarie 2022 - 17:42, said:

In sed nu stiu daca reusesti, am impresia ca citeste line by line si nu cred ca il poti forta sa faca altfel.
Tu ai nevoie sa legi de tagul X indiferent daca e pe aceeasi linie sau pe alta si deci regexul trebuie sa fie multilinie.

Ai putea face cu perl, cam asa:

variable="blabla"; perl -s -pi -e "BEGIN{undef $/} ; s/(<PackageReference Include=\"Test1\">\s+<Version>)[^<]+(<\/Version>)/\1${var}\2/smg" -- -var="$variable" file_name


Inlocuiesti variable="blabla" cu definitia ta si lui perl ii zici sa puna in variabila lui var ce ai in variabila din bash.

Fa si tu un backup inainte, sa nu iasa vreo duda. :-)

poti sa ma ajuti te rog sa primesc valoarea deja setata  tot prin perl?

#12
valeriux1

valeriux1

    New Member

  • Grup: Candidate Members
  • Posts: 9
  • Înscris: 07.06.2021
Am rezolvat cu xmllint
xmllint --xpath "//*[local-name()='PackageReference'][@Include='Test1']/*[local-name()='Version']/text() file.xml

Anunturi

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate