从匹配模式中捕获注释字符

从匹配模式中捕获注释字符

我想从文件中挑选出匹配的行

# Mode: org

#可以是文件编程语言的任何注释字符。

除了 之外#,in 也可以是;或中的任何一个!,使用 bash 脚本可以带有任何前面的空格数。

例子

# Mode: org

   ;; Mode: org

!! Mode: org

人们可以从文件扩展名中找出语言

.el    emacs
.c     c
.cc    c++
.sh    bash
.rc    bash
.f     fortran
.F     fortran
.f90   fortran
.texi  texinfo
.tex   tex

这是我当前使用的 bash 函数

capture ()
{
 local efile="$1"

 local begorg endorg charcl

 impl="1"
 if [ "$impl" = "1" ]; then 
   charcl='^[[:space:]]*(#|;|!)+[[:space:]]*' 
 elif [ "$impl" = "2" ]; then
   charcl='^[[:space:]]*(//|@c)[[:space:]]*' 
 fi 
 
 begorg="${charcl}"'Mode: org$'
 endorg="${charcl}"'# End of org$'
 
 awk -v ccls="$charcl" -v bego="$begorg" -v endo="$endorg" \
   '$0 ~ bego { found=1; next } 
    $0 ~ endo { found=0; } 
    found { sub(/ccls/,""); print }' "$efile"
}

这样做会更好awk,但我在如何包含该模式方面遇到了困难。

/<pattern>/ { set variable to A }
/other pattern/ { set variable to B }
... use variable in sub

相关内容