我想知道如何枚举特定行,在本例中仅枚举带括号的行之后的行
原始文件: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 线路将按原样释放。
- 自动打印选项将最终打印该行。