结果

结果

我想知道如何枚举特定行,在本例中仅枚举带括号的行之后的行

原始文件:file.txt

TITLE: hello world 
SUBTITLE: document about hello world    

[CONTENT 1]   
That's a line   
Another one   
Row    

[EXAMPLE]    
Example line   

[CONTENT 2]   
A  
B   
C   

Text, text, text....

想要的结果:file.txt

TITLE: hello world 
SUBTITLE: document about hello world    

[CONTENT 1]   
1 That's a line   
2 Another one   
3 Row    

[EXAMPLE]    
5 Example line   

[CONTENT 2]   
6 A  
7 B   
8 C   

Text, text, text....

答案1

awk解决方案:

awk '/^\[.+\]/{ f=1 }f && $0~/^\w/{ $0=++c FS $0 }!NF{ f=0 }1' file
  • /^\[.+\]/{ f=1 }- 用括号匹配一行并用f标志标记它

  • f && $0~/^\w/{ $0=++c FS $0 }- 为“带括号”行之后的行添加计数器值

  • !NF{ f=0 }- 忽略空行和以下行(f=0- 重置表示反操作的标志)


输出:

TITLE: hello world 
SUBTITLE: document about hello world    

[CONTENT 1]   
1 That's a line   
2 Another one   
3 Row    

[EXAMPLE]    
4 Example line   

[CONTENT 2]   
5 A  
6 B   
7 C   

Text, text, text....

答案2

perl -pe 's/^/++$a.$"/e if /^\[/ ... /^$/ and /^(?!\[)./' file.txt

结果

TITLE: hello world
SUBTITLE: document about hello world

[CONTENT 1]
1 That's a line
2 Another one
3 Row

[EXAMPLE]
4 Example line

[CONTENT 2]
5 A
6 B
7 C

Text, text, text....

解释

  • -p选项逐行处理文件+启用自动打印。
  • s/^/.../e将在计数器和空格前面添加($"默认情况下 = 列表分隔符 = 空格)
  • /e替换命令的修饰符会将 RHS 视为要计算的 Perl 代码,并将结果放置为替换结果。
  • 仅当选择以下正则表达式时才会发生替换:
    • /^\[/ .. /^$/=> 这选择从以左方括号开头的行开始的一系列行,并在找到空行时结束该范围。
    • 通过选择拒绝范围边界的行来进一步细化范围,即匹配具有至少一个字符且该行不以左方括号开头的行。因此,只有当满足这两个条件时,才会发生替换,OTW 线路将按原样释放。
  • 自动打印选项将最终打印该行。

相关内容