正規表現を使用してファイルの次の行を一致させたい。
## 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 lispファイルを考えてみましょう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")
その後、正規表現は行;; HD [OPCON]
sumと一致します;; HD [OPCON] elisp,resource
。
ユーザーが指定した場合
awk -f densel -v faml="HD" -v asmb="OPCON" -v kw="resource" galex.el
次の行だけが一致します。
;; HD [OPCON] elisp,resource
答え1
あなたの質問は不明ですが、おそらくこれはあなたが望むものです(GNU awkを3番目の引数として使用します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]
等価の内容に割り当てます。
あなたのニーズに合わせて正規表現を変更してください。これは、私が考える問題と解決策を最小限の方法で示し、生成方法を示すことです。再現可能な最小例今後さらに質問が必要な場合。
match()
よりhttps://www.gnu.org/software/gawk/manual/gawk.html#String-Functionsこの機能の役割は何ですか?