2017-06-28 7 views
0

also hier ist mein awk-Skript. Es ist in einer Datei mAwk.awkawk Musterabgleich mit Variable mit XML-Wert

#!usr/bin/awk -f 
    BEGIN { 
    FS="." 
    artifactPattern="/<artifactId>artifactName1|artifactName2<\\/artifactId>/" 
# print "-------------" artifactPattern 
    } 
    { 
    toPrint = 1 
    if ($0 ~ /<dependencies>/) { 
     matches=1000; 
    } 
    else if ($0 ~ /<dependency>/) { 
     matches +=100; 
    } 
    else if ($0 ~ /<\/dependency>/) { 
     matches =1000; 
    } 
    else if ($0 ~ /<groupId>(com.group1.*)|(com.group2.*)|(com.group3.*)<\/groupId>/) { 
     matches += 10; 
    } 
# else if($0 ~ /<artifactId>artifactName1|artifactName2<\/artifactId>/){ 
else if($0~artifactPattern){ 
     matches += 1; 
     } 
    else if ($0 ~ /<version>[0-9]+\.[0-9]+\.[0-9]+<\/version>/) { 
    print "debugging: matched 1 -", matches 
     if (matches == 1111) { 
     lastPart="0-SNAPSHOT</version>" 
     print $1 "." $2+1 "." lastPart; 
     matches -= 11; 
     toPrint = 0 
     } 
    } 
    else if ($0 ~ /<\/dependencies>/) { 
     matches=0 
    } 
    if (toPrint == 1) { 
     print $0 
    } 
    } 
    END { 
    } 

Jetzt ist hier die Struktur der XML-Datei (es ist ein pom.xml), nur im Fall genannt:

<project> 
    <random tags/> 

    <dependencies> 
    <dependency> 
     <groupId>data</groupId> 
     <artifactId>data</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
     ... repeat... 
    </dependencies> 
</project 

Das Problem ist, wenn ich die Zeile:

# else if($0 ~ /<artifactId>payment-common|test2-common<\/artifactId>/){ 

statt dem unmittelbar darunter, sie paßt ganz gut, aber wenn ich den Wert in einer Variable setzen, es funktioniert nicht. Was ist denn hier los?

Mein Endziel ist dies durch einen Shell-Skript zu nennen wie ...

awk -v pattern=`cat ./artifactPatterns.txt` mAwk.awk -f myFile.xml 

und die artifactPatterns.txt aussehen wird waht die Variable hält in der awk-Datei Beispiel:

/<artifactId>artifactName1|artifactName2<\\/artifactId>/ 

Ich habe eine Menge Dinge ausprobiert und nichts scheint zu funktionieren, danke für Ihre Zeit!

+0

Haben Sie darüber nachgedacht, ein Tool wie 'xmlstarlet' zu verwenden, um XML in Shell-Skripten zu analysieren, anstatt' awk'? – Barmar

+0

@Barmar Offensichtlich nicht, obwohl es ihm mehrmals vorgeschlagen wurde. –

+0

@MichaelVehrs Ja, es scheint, als ob dieser Typ wirklich entschlossen ist, "awk" zu lernen, indem er jedes Mal, wenn er auf ein Problem stößt, Fragen stellt. – Barmar

Antwort

0

Nehmen Sie die // Trennzeichen um den Wert von artifactPattern heraus. Dies sind die Syntax für Regexp-Literale, sie gehören nicht in Strings. Die Verwendung des Operators ~ impliziert, dass es sich um einen regulären Ausdruck handelt.

Und da / kein Trennzeichen ist, müssen Sie nicht innerhalb des Werts entkommen.

artifactPattern="<artifactId>artifactName1|artifactName2</artifactId>" 

Auch $0 ~ /pattern/ vereinfacht werden kann, um nur /pattern/ - wenn ein regexp wörtlichen erscheint von selbst, wird standardmäßig gegen die ganze Linie zu entsprechen.