[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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. #>
复制代码

11  5  2左右的值是固定的?
也默认在1  3  5行吗

TOP

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

回复 2# pd1


  感谢!

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

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

TOP

  1. $a=@{}
  2. foreach($l in ($f=gc 1.txt)){
  3.     if($l -match '\d+'){
  4.         $m=$matches[0]
  5.         if([int]$m -gt $i){[int]$i=$m}
  6.         $a[[int]$m]=1
  7.     }elseif($l -match '^@'){
  8.         1..$i|%{if(!$a[$_]){$i=$_;break}}
  9.     }
  10. }
  11. $f -join "`r`n" -replace '(?s)(?<=^[^@]+?)\s+(?=@)',"`r`n我是要加的文本$i`r`n`r`n"
复制代码

TOP

回复 4# idwma

多谢,

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

hello3world
-
hello2go
>
world1to

TOP

回复 5# meixi
  1. $a=@{}
  2. foreach($l in ($f=gc 1.txt)){
  3.     if($l -match '\d+'){
  4.         $m=$matches[0]
  5.         if([int]$m -gt $i){[int]$i=$m}
  6.         $a[[int]$m]=1
  7.     }elseif($l -match '^@'){
  8.         1..$i|%{if(!$a[$_]){$i=$_;break}}
  9.         if($a.count -eq $i){$i++}
  10.         break
  11.     }
  12. }
  13. $f -join "`r`n" -replace '(?s)(?<=^[^@]+?)\s+(?=@)',"`r`n我是要加的文本$i`r`n`r`n"
复制代码
1

评分人数

    • meixi: 感谢分享技术 + 1

TOP

娱乐一下:
  1. $s = @'
  2. hello11world
  3. -
  4. hello2go
  5. >
  6. world5to
  7. @hello
  8. hello
  9. @world
  10. world
  11. '@
  12. $a='添加字符串';
  13. [regex]::Replace($s, '(?s)^[^@]+', {
  14. if([string]::IsNullOrEmpty($args.Value.Trim())){return $args.Value;}
  15. [int[]]$num=[regex]::Matches($args.Value, '\d+').Value;
  16. $n=1;
  17. while($true){if($num -ne$null -and$num.Contains($n)){$n++}else{break;}}
  18. return "{0}`r`n$a$n`r`n`r`n" -f$args.Value.TrimEnd();
  19. })
复制代码
1

评分人数

    • meixi: 乐于助人技术 + 1
QQ: 己阵亡
脚本优先 [PowerShell win10]

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

回复 8# meixi
  1. [regex]::Matches($args.Value,'(?m)^(?:(?!\d).)*\d+').value -replace '\D+'
复制代码
复制代码
不再回复,多看一下正则即可。
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

  1. [regex]::Matches($args.Value,'(?m)(?<=^[^\d]*)\d+').value;
复制代码
也可以。 确定左边界就行。然后减少匹配次数。
QQ: 己阵亡
脚本优先 [PowerShell win10]

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

返回列表