"CN中的"為什麼不是與(/\"CN=/,\"\")中逗號後面的"匹配,而是與1.txt後面的那一個匹配呢?
这个理解是错误的
在cmd中,"CN中的"是与最前的"{gsub中的"相匹配的
这就是所谓的“最近匹配原则”
也可以理解为第(2*n)个的引号与(2*n-1)个引号相匹配(n为自然数)
即所谓的“前单配后双”原则
这种原则实现起来是最为简单的
不需要使用栈来保存"的层级
大约只需要做个开始与结束的标记就可以了
遇到第一个引号标记引号串开始
空格、Tab、分号等所有分界符和其它一些转义字符失效
直到遇到第二个引号
标记引号串结束
分界符等重新生效
如果再遇到第三个引号
则分界符等再次失效
直到下一个引号出现
如此反复
如果引号串之间没有出现分界符
则所有引号串以及其间的串被认作一个串
-----------------------
对于这行gawk "{gsub(/\"CN=/,\"\");print}" 1.txt" | gawk -F"(" "{print $1}"
cmd首先将它理解为五个串
1、gawk
2、"{gsub(/\"CN=/,\"\");print}" 1.txt"
3、|
4、gawk
5、-F"("
6、"{print $1}"
而最有疑义的第2个串是由下面几个子串组成的
2-1、"{gsub(/\"
2-2、CN=/,\
2-3、"\"
2-4、);print}
2-5、" 1.txt"
几个子串之间因为没有空格等分界符
所以被认为是一个字符串
并作为参数传给了gawk
至于gawk如何分析这个串就是Gawk内部的事了
-----------------------
因此,据我的理解
那个gawk句子也可以改作以下几种形式
而不会让cmd产生误解
gawk "{gsub(/\"CN=/,\"\");print}"" 1.txt | gawk -F"(" "{print $1}"
gawk {gsub(/\"CN=/,\"\");print} 1.txt" | gawk -F"(" "{print $1}"
上面两句cmd仍然将gawk 到 | 之间的部分认作一个串
下面两句cmd会则将它认作两个串,第二个串是 1.txt
gawk "{gsub(/\"CN=/,\"\");print} 1.txt | gawk -F"(" "{print $1}"
gawk {gsub(/\"CN=/,\"\");print}" 1.txt | gawk -F"(" "{print $1}"
至于会让gawk是否会产生歧义
因为没有测试环境不太肯定
前面两句应该是没有什么问题的
后面两句则可以存疑
而这样的句子很可能是不行的
gawk "{gsub(/\"CN=/, \"\");print}" 1.txt" | gawk -F"(" "{print $1}"
因为逗号后多了一个空格
而且这个空格正好位于2*n与2*n+1之间的引号中
因此cmd将它视作参数分界符
而将"{gsub(/\"CN=/, \"\");print}" 1.txt"分成了两个串
2、"{gsub(/\"CN=/,
2+1、\"\");print}" 1.txt"
而Gawk应该是不支持将匹配模式写在两个串中的
Last edited by qzwqzw on 2007-6-25 at 05:07 PM ]