标题: [问题求助] 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
- $s = @'
- hello11world
- -
- hello2go
- >
- world5to
-
-
-
- @hello
- hello
-
- @world
- world
- '@
- $a = "我是要加的文本"
-
-
- <# 处理后输出:
- hello11world
- -
- hello2go
- >
- world5go
- 我是要加的文本1
-
- @hello
- hello
-
- @world
- world
- #>
复制代码
作者: 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
- $a=@{}
- foreach($l in ($f=gc 1.txt)){
- if($l -match '\d+'){
- $m=$matches[0]
- if([int]$m -gt $i){[int]$i=$m}
- $a[[int]$m]=1
- }elseif($l -match '^@'){
- 1..$i|%{if(!$a[$_]){$i=$_;break}}
- }
- }
- $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 - $a=@{}
- foreach($l in ($f=gc 1.txt)){
- if($l -match '\d+'){
- $m=$matches[0]
- if([int]$m -gt $i){[int]$i=$m}
- $a[[int]$m]=1
- }elseif($l -match '^@'){
- 1..$i|%{if(!$a[$_]){$i=$_;break}}
- if($a.count -eq $i){$i++}
- break
- }
- }
- $f -join "`r`n" -replace '(?s)(?<=^[^@]+?)\s+(?=@)',"`r`n我是要加的文本$i`r`n`r`n"
复制代码
作者: xczxczxcz 时间: 2022-11-27 20:54
娱乐一下:- $s = @'
- hello11world
- -
- hello2go
- >
- world5to
-
-
-
- @hello
- hello
-
- @world
- world
- '@
-
- $a='添加字符串';
-
- [regex]::Replace($s, '(?s)^[^@]+', {
- if([string]::IsNullOrEmpty($args.Value.Trim())){return $args.Value;}
- [int[]]$num=[regex]::Matches($args.Value, '\d+').Value;
- $n=1;
- while($true){if($num -ne$null -and$num.Contains($n)){$n++}else{break;}}
- return "{0}`r`n$a$n`r`n`r`n" -f$args.Value.TrimEnd();
- })
复制代码
作者: 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 - [regex]::Matches($args.Value,'(?m)^(?:(?!\d).)*\d+').value -replace '\D+'
复制代码
复制代码
不再回复,多看一下正则即可。
作者: xczxczxcz 时间: 2022-11-27 23:27
- [regex]::Matches($args.Value,'(?m)(?<=^[^\d]*)\d+').value;
复制代码
也可以。 确定左边界就行。然后减少匹配次数。
作者: meixi 时间: 2022-11-27 23:41
回复 6# idwma
刚试了一下, 发现@开头的行后面的数字会影响序号
我把第5行后面的1删了, 加的序号是对的, 不删加的序号是错的- $s = @'
- hello 1 a 3 aa 1
- world 2 a 6 aa 3
-
- @hello helo1
- hello
-
- @world world2
- world
- '@ -split '\r?\n'
- $a = "我是要加的文本"
-
- #$f = gc 1.txt
- $a = @{ }
- foreach ($l in ($f = $s))
- {
- if ($l -match '\d+')
- {
- $m = $matches[0]
- if ([int]$m -gt $i) { [int]$i = $m }
- $a[[int]$m] = 1
- }
- elseif ($l -match '^@')
- {
- 1 .. $i | %{ if (!$a[$_]) { $i = $_; break } }
- if ($a.count -eq $i) { $i++ }
- break
- }
- }
- $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 |