所以这是我的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>/
我尝试了很多东西,似乎没什么用,谢谢你的时间!
答案 0 :(得分:0)
围绕//
的价值取出artifactPattern
分隔符。这些是regexp文字的语法,它们不属于字符串。使用~
运算符意味着它是正则表达式。
由于/
不是分隔符,因此您无需在值内转义它。
artifactPattern="<artifactId>artifactName1|artifactName2</artifactId>"
此外,$0 ~ /pattern/
可以简化为/pattern/
- 当正则表达式文字本身出现时,默认为匹配整行。