[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] PowerShell如何在特定的行前添加文本?

大家好:

我想在下面的
第一个@开头的行之前,
且在前面的已有文本的行之后,
添加变量$a的文本

注意:
1.变量$a的文本后面还要加上1个序号, 这个序号需要判断前面所有行中间的数字来得出
例如下面的文本:
已经有了 2,  5,  11, 还没有1, 则添加的文本后面序号为1
但是如果已经有了 1,  2,  5,  11, 还没有3, 那添加的文本后面序号为3
规律就是添加前面所有数字中没还没有的最小数字

2.数字左右的文本不是固定的, 但是,肯定会有一个1-3位的数字在一行中
含有数字的行也不是固定的, 但它总是出现在字母或文字开头的行, 即符号开头的行中间是不会有数字的

3.处理后, 第一个@开头的行之前只保留一个空行
------------------------------------------------------------------------------
hello11world
-
hello2go
>
world5to



@hello
hello

@world
world
------------------------------------------------------------------------------
处理后输出:

hello11world
-
hello2go
>
world5go
我是要加的文本1

@hello
hello

@world
world
  1. $s = @'
  2. hello11world
  3. -
  4. hello2go
  5. >
  6. world5to
  7. @hello
  8. hello
  9. @world
  10. world
  11. '@
  12. $a = "我是要加的文本"
  13. <# 处理后输出:
  14. hello11world
  15. -
  16. hello2go
  17. >
  18. world5go
  19. 我是要加的文本1
  20. @hello
  21. hello
  22. @world
  23. world
  24. #>
复制代码

本帖最后由 meixi 于 2022-11-27 18:22 编辑

回复 2# pd1


  感谢!

数字左右的文本不是固定的, 但是,肯定会有一个1-3位的数字在一行中

所在的行也不是固定的, 但它总是出现在字母或文字开头的行, 即符号开头的行中间是不会有数字的

TOP

回复 4# idwma

多谢,

忘了一点逻辑, 像下面这种情况, 应该怎样改代码?
当没有要补的中间数时, 要顺着最后面的数字向后加1, 添加的文本后面的序号应该是4

hello3world
-
hello2go
>
world1to

TOP

本帖最后由 meixi 于 2022-11-27 23:14 编辑

回复 7# xczxczxcz

多谢!

请教怎样只匹配一行中先出现的数字, 而后面出现的数字则忽略掉不计?
例如下面的示例文本,  我在先出现的数字左右加了些空格, 在数字后面又加了些字符和数字,
即: 只有先出现的数字才参与序号的计算!
下面的文本执行后, 序号是4 应该是2就对了

$s = @'
hello 1 a 1 cc 1
world 3 b5 bb 2



@hello
hello

@world
world
'@

TOP

回复 6# idwma

刚试了一下, 发现@开头的行后面的数字会影响序号
我把第5行后面的1删了, 加的序号是对的, 不删加的序号是错的
  1. $s = @'
  2. hello 1 a 3 aa 1
  3. world 2 a 6 aa 3
  4. @hello helo1
  5. hello
  6. @world world2
  7. world
  8. '@ -split '\r?\n'
  9. $a = "我是要加的文本"
  10. #$f = gc 1.txt
  11. $a = @{ }
  12. foreach ($l in ($f = $s))
  13. {
  14. if ($l -match '\d+')
  15. {
  16. $m = $matches[0]
  17. if ([int]$m -gt $i) { [int]$i = $m }
  18. $a[[int]$m] = 1
  19. }
  20. elseif ($l -match '^@')
  21. {
  22. 1 .. $i | %{ if (!$a[$_]) { $i = $_; break } }
  23. if ($a.count -eq $i) { $i++ }
  24. break
  25. }
  26. }
  27. $f -join "`r`n" -replace '(?s)(?<=^[^@]+?)\s+(?=@)', "`r`n我是要加的文本$i`r`n`r`n"
复制代码

TOP

回复 10# xczxczxcz


  多谢, 这个可以了

惭愧, 复杂的正则还看不太懂

TOP

返回列表