返回列表 发帖

[问题求助] [已解决]powershell按层级和先后顺序修改每行前的序号

本帖最后由 meixi 于 2022-12-17 15:35 编辑

下面的图片, 左侧是要处理的源文本, 右侧框中是处理后的效果, 同种颜色表示它们在同一层级的意思
注意事项:
1.进入到下一层级的标记是: 该层级之前的行开头有个 )   退出某一层级的标记是: 该层级之后的行开头有个 (
2.下一层级的起始序号是上一层最后面的序号其后加上1
3.每一层级的序号其先后顺序都修改为递加1
4.只改每一行前的序号, 序号前后的空格和文本都不要修改
5.示例文本中层级有三级, 实际情况可能会有N级

$s= @'
1 中间
1 国家
+
3 日
+
9 韩
10 国
-
) 13 中
41 日
48 美
-
63 中
) 43 日
12 美
22 丽
(
43 美
(
6 日
9 中
) 13 好
43 日
) 43 子
02 大家
82 中
(
43 华
-
72 行人
63 列
14 必须
(
-
1 日
1 本
+
1 美丽
1 国
'@
<# 处理后的效果:
1 中间
2 国家
+
3 日
+
4 韩
5 国
-
) 6 中
61 日
62 美
-
63 中
) 64 日
641 美
642 丽
(
65 美
(
7 日
8 中
) 9 好
91 日
) 92 子
921 大家
922 中
(
93 华
-
94 行人
95 列
96 必须
(
-
10 日
11 本
+
12 美丽
13 国
#>COPY
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

$a=@(0)
$s -split '\n'|%{
    if($_ -match '^\D*\d+'){
        $a[-1]+=1
        $_ -replace '(?<=^\D*)\d+',($a -join '')
    }else{$_}
    if($_ -match '^\s*\)'){$a+=0}
    if($_ -match '^\s*\('){$a=$a[0..($a.count-1-1)]}
}COPY
1

评分人数

    • meixi: 乐于助人技术 + 1

TOP

回复 2# idwma

多谢!

TOP

返回列表