如何编写Sed脚本注释多行标记A\nB与U\nV之间的行?
Sed脚本编写需求
我有一个名为test的文件,内容如下:
X X B A B X X X U U V X X
需要将该文件编辑为如下输出结果:
X X B A B # X # X # X # U U V X X
尝试过以下命令但无法满足需求:
cat test | sed -E '1,/B/!{/U/,$!s/.+/# &/}'
原因是该命令会从第一个B开始匹配并注释后续内容,但实际需要从多行标记A\nB之后开始处理。
解决方案
使用Sed的多行处理功能,先精准匹配A\nB这个多行起始标记,再对后续指定范围的行添加注释前缀:
sed -E ' # 匹配单独的"A"行,读取下一行检查是否是"B" /^A$/{ N /\nB$/{ # 打印"A"和"B"这两行,保留原有内容 P D # 进入注释处理循环 :comment_mode n # 遇到单独的"U"行时,注释该行后切换到正常输出模式 /^U$/{ s/^/# / p :normal_mode n p b normal_mode } # 空行直接输出,不添加注释 /^$/b print_line # 非空行添加注释前缀 s/^/# / :print_line p b comment_mode } } ' test
脚本逻辑说明
- 先定位到单独的
A行,读取下一行确认是B,以此确定注释起始点; - 进入注释模式后,对后续每行进行判断:
- 若遇到单独的
U行,注释该行后切换到正常输出模式,不再处理后续行; - 空行直接输出,不添加注释;
- 其他非空行添加
#前缀后输出;
- 若遇到单独的
- 正常输出模式下,后续所有内容直接原样输出。
内容的提问来源于stack exchange,提问作者Alexander Seidl
相关产品推荐
相关产品推荐

