【发布时间】: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