awkを使用して3つの領域をキャプチャ

awkを使用して3つの領域をキャプチャ

正規表現を使用してファイルの次の行を一致させたい。

## 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されます。asmkywfamlasmbkw

##;;二重コメント文字、、、、!!//始まるコメントセクションのソースコードファイルに対して行一致が実行されます@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この機能の役割は何ですか?

関連情報