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!
Haben Sie darüber nachgedacht, ein Tool wie 'xmlstarlet' zu verwenden, um XML in Shell-Skripten zu analysieren, anstatt' awk'? – Barmar
@Barmar Offensichtlich nicht, obwohl es ihm mehrmals vorgeschlagen wurde. –
@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