Board logo

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

作者: meixi    时间: 2022-11-27 09:12     标题: 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. #>
复制代码

作者: pd1    时间: 2022-11-27 15:29

11  5  2左右的值是固定的?
也默认在1  3  5行吗
作者: meixi    时间: 2022-11-27 16:42

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

回复 2# pd1


  感谢!

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

所在的行也不是固定的, 但它总是出现在字母或文字开头的行, 即符号开头的行中间是不会有数字的
作者: idwma    时间: 2022-11-27 18:35

  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"
复制代码

作者: meixi    时间: 2022-11-27 19:27

回复 4# idwma

多谢,

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

hello3world
-
hello2go
>
world1to
作者: idwma    时间: 2022-11-27 20:25

回复 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"
复制代码

作者: xczxczxcz    时间: 2022-11-27 20:54

娱乐一下:
  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. })
复制代码

作者: meixi    时间: 2022-11-27 23:09

本帖最后由 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
'@
作者: xczxczxcz    时间: 2022-11-27 23:19

回复 8# meixi
  1. [regex]::Matches($args.Value,'(?m)^(?:(?!\d).)*\d+').value -replace '\D+'
复制代码
复制代码
不再回复,多看一下正则即可。
作者: xczxczxcz    时间: 2022-11-27 23:27

  1. [regex]::Matches($args.Value,'(?m)(?<=^[^\d]*)\d+').value;
复制代码
也可以。 确定左边界就行。然后减少匹配次数。
作者: meixi    时间: 2022-11-27 23:41

回复 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"
复制代码

作者: meixi    时间: 2022-11-27 23:43

回复 10# xczxczxcz


  多谢, 这个可以了

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




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2