![awk를 사용하여 세 영역 캡처](https://linux55.com/image/217433/awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%84%B8%20%EC%98%81%EC%97%AD%20%EC%BA%A1%EC%B2%98.png)
정규식을 사용하여 파일의 다음 줄을 일치시키고 싶습니다.
## 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를 세 번째 인수로 사용 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이 기능의 역할은 무엇입니까?