awk를 사용하여 세 영역 캡처

awk를 사용하여 세 영역 캡처

정규식을 사용하여 파일의 다음 줄을 일치시키고 싶습니다.

## 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를 세 번째 인수로 사용 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이 기능의 역할은 무엇입니까?

관련 정보