【问题标题】:Stop printing when non-comment lines are reached到达非注释行时停止打印
【发布时间】:2023-02-02 08:45:53
【问题描述】:

我在以下表格的各部分之间打印

## FAML [ASMB] keyword,keyword  

## Some text

## END OF FAML [ASMB]

我遇到了未达到“## END OF FAML [ASMB]”时出现的问题。我想在遇到不以注释字符“##”开头的行时立即停止。

例如,我想在到达“某些代码”时停止,即使它没有找到“## END OF FAML [ASMB]”,因为该行不是以“##”开头。

## FAML [ASMB] keyword,keyword  

## Some text

## End OF FAL

Some code

这是实现

spc='[[:space:]]*'
gph="[[:graph:]]+"
cmt='\/\/'
ebl='\['
ebr='\]'

local pn_ere="^[[:space:]]*([#;!]+|@c|${cmt})[[:space:]]+"
local kys="(([^,]+)(,[^,]+)*)?"

nfaml=${faml:-"[[:graph:]]+"}
nasmb=${asmb:-"[[:graph:]]+"}

beg_ere="${pn_ere}${nfaml} ${ebl}${nasmb}${ebr}${spc}${kys}$"
end_ere="${pn_ere}END OF ${nfaml} ${ebl}${nasmb}${ebr}${spc}$"

sed -E -n "/$beg_ere/,/$end_ere/ {
     /$end_ere/z; s/$pn_ere// ; p
  }" "$filename"

【问题讨论】:

  • 在您提供的每个样本中,输入实际上是否包含 3 个空行?
  • 是的,随着 cmets 的发展,空行是允许的。空白行被认为是有效的,当一个到达非注释行时,应该停止打印。直到当然还有另一个匹配beg_ere
  • 没有遇到beg_ere的问题。

标签: sed


【解决方案1】:

您可以检查未评论并忽略。例如

# ...

trunc_end_ere='^[^#[:space:]]+'

sed -E -n "/$beg_ere/,/($end_ere)|($trunc_end_ere)/ {
    /$trunc_end_ere/d
    /$end_ere/z
    s/$pn_ere//
    p
}" "$filename"

【讨论】:

    猜你喜欢
    • 2020-12-06
    • 2019-09-26
    • 1970-01-01
    • 2021-09-12
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    相关资源
    最近更新 更多