【问题标题】:awk pattern matching using variable with xml value使用具有 xml 值的变量进行 awk 模式匹配
【发布时间】:2017-06-28 22:28:10
【问题描述】:

这是我的 awk 脚本。它在一个名为 mAwk.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 {
  }

下面是 xml 文件的结构(它是 pom.xml),以防万一:

<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>/){

而不是它正下方的那个,它匹配得很好,但是当我将值放入变量时,它会失败。这是怎么回事?

我的最终目标是通过一个 shell 脚本来调用它,比如...

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

artifactPatterns.txt 看起来就像变量保存在 awk 文件中一样,例如:

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

我尝试了很多东西,但似乎没有任何效果,感谢您的宝贵时间!

【问题讨论】:

  • 您是否考虑过使用xmlstarlet 之类的工具来解析shell 脚本中的XML,而不是awk
  • @Barmar 显然不是,尽管有人向他建议过好几次。
  • @MichaelVehrs 是啊,看来这家伙真的是下定决心要学习awk,每次遇到问题都会提出问题。

标签: linux shell awk sed pattern-matching


【解决方案1】:

去掉artifactPattern 值周围的// 分隔符。这些是正则表达式文字的语法,它们不属于字符串。使用~ 运算符意味着它是一个正则表达式。

由于/ 不是分隔符,因此您无需在值内对其进行转义。

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

另外,$0 ~ /pattern/ 可以简化为 /pattern/ -- 当正则表达式文字单独出现时,它默认匹配整行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多