2017-06-28 3 views
0

ここにawkスクリプトがあります。それはちょうどで-場合、今ここでxmlファイル(それはのpom.xmlだ)の構造だxml値の変数を使用したawkパターンマッチング

#!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 { 
    } 

mAwk.awkと呼ばれるファイルにあります:私が使用している場合

<project> 
    <random tags/> 

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

問題は、ありますライン:

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

だけではなく、1つ下の、それがうまく一致しますが、私は、変数内の値を入れると、それは失敗します。何が起きてる?

私の最終的な目的は...シェルスクリプトなどを介して

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

これを呼び出すことで、artifactPatterns.txtは、変数が、例えばawkのファイルに保持しているWAHTのようになります。

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

私はたくさんのものを試しましたが、何も動作していないようです、あなたの時間をありがとう!

+0

'awk'ではなく' xmlstarlet'のようなツールを使ってシェルスクリプトでXMLを解析することを検討しましたか? – Barmar

+0

@Barmar明らかにそうではありませんが、それは彼に何度か示唆されています。 –

+0

@MichaelVehrsええ、この男は本当に彼が問題に遭遇するたびに質問することによってawkを学ぶことに決心しているようです。 – Barmar

答えて

0

artifactPatternの値の前後の//の区切り文字を取り除きます。これらは正規表現リテラルの構文であり、文字列には属しません。 ~演算子を使用すると、それは正規表現であることを意味します。

/は区切り文字ではないため、値の中でエスケープする必要はありません。

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

また、$0 ~ /pattern/を簡素化することができるちょうど/pattern/ - ときそれ自体で正規表現リテラルが表示され、行全体に対してマッチングがデフォルト。

関連する問題