我希望能够使用常规的exprossion来匹配文件中的下列行
## FAML [ASMB]
## FAML [ASMB] KYA
## FAML [ASMB] KYA,KYB然后能够捕获FAML、ASMB值和逗号分隔关键字KYA,KYB的顺序。
用户提供FAML、ASMB以及他们想要匹配KYA,KYB等的任何关键字。
我在做
BEGIN {
kw=".*" ; ebl="[[]" ; ebr="[]]" ; spc="[[:space:]]*"
pn_ere = "^[[:space:]]*([#;!]+|@c|//)[[:space:]]+"
fm = "%s(%s) %s(%s)%s(%s)%s$"
beg_ere = sprintf(fm, pn_ere, faml, ebl, asmb, ebr, kw, spc)
}
$0 ~ beg_ere {
fml = gensub(beg_ere, "\\2", 1, $0)
asm = gensub(beg_ere, "\\3", 1, $0)
kyw = gensub(beg_ere, "\\4", 1, $0)
}其中,(%s)用于捕获文件中的fml、asm和kyw,以匹配faml、asmb和kw的任何用户输入。
行匹配将在注释部分的源代码文件上执行,从双注释字符##、;;、!!、//、@c开始。
因此,用户可以调用
awk -f densel -v faml="HD" -v asmb="OPCON" galex.el例如,考虑一个emacs文件galex.el。
;; HD [TEST]
(defun galex-insert (n)
"Copy line N at current point.
N is the numeric prefix arg"
(interactive "p")
(save-excursion
(goto-char (point-min))
(forward-line (1- n))
(kill-ring-save (line-beginning-position) (line-end-position))))
;; HD [OPCON]
(message "\nGALEX")
;; HD [OPCON] elisp,resource
(message "\nGALEX")然后,regexp将匹配;; HD [OPCON]和;; HD [OPCON] elisp,resource行。
如果用户指定
awk -f densel -v faml="HD" -v asmb="OPCON" -v kw="resource" galex.el只有下面一行才能匹配
;; HD [OPCON] elisp,resource发布于 2023-02-25 00:02:09
您的问题还不清楚,但这可能是您想要做的事情(使用GNU进行第三次match()):
$ cat tst.awk
BEGIN {
re = "#+ ([^ ]+) ([[][^]]*]) *(.*)"
}
match($0,re,a) {
for (i=1; i in a; i++) {
print i, a[i]
}
print ""
}$ awk -f tst.awk file
1 FAML
2 [ASMB]
3
1 FAML
2 [ASMB]
3 KYA
1 FAML
2 [ASMB]
3 KYA,KYB显然,只需将您喜欢的任何变量分配给a[1]的内容,等等。
更改regexp以满足您的需要,这只是为了以最小的方式演示我认为的问题和解决方案,并向您展示如何创建最小可重现性示例如果/当您将来需要问其他问题时。
有关该函数的功能,请参阅match() in https://www.gnu.org/software/gawk/manual/gawk.html#String-Functions。
https://unix.stackexchange.com/questions/736817
复制相似问题