我是 Powershell 新手,只编写了几个基本脚本。 这是我正在尝试做的事情: 对于下面的文本行,我想比较每行末尾的两个值(参见下面的 pstest.txt)(50,20 line3 ; 20,50 line4) 如果第一个值高于第二个值,则替换该行上的文本。 我已经研究了几种可能的方法,但找不到适合这种情况的方法。
到目前为止,我已经找到了替换特定文本的解决方案,并找到了一种从特定行检索值进行比较的方法,但不确定如何从这里继续。 我的目标是仅修改第一个“维度”大于第二个“维度”的行。 当条件为真时,在“5-STD”后面添加“T”,并修剪行尾。 然后将文件写入原始文件。 下面是我的脚本,到目前为止,我包含了 pstest.txt 文件的副本以供参考。
$line3 = Get-Content "c: emp\pstest.txt" | Select-Object -Index 2 # 获取第一个行项目(忽略前 2 行) $line4 = Get-Content "c: emp\pstest.txt" | $line4 = Get-Content "c: emp\pstest.txt" | Select-Object -Index 3 # 获取第二行项目 $value1 = $line3.Substring(129,2) # 从第一个行项目获取第一个维度值 $value2 = $line3.Substring(133,2) # 从第一个行项目获取第二个维度值 $value3 = $line4.Substring(129,2) # 从第二行项目获取第一维度值 $value4 = $line4.Substring(133,2) # 从第二行项目获取第二维度值 Write-Host $value1, $value2 # 显示值 - 仅测试 Write-Host $value3, $value4 # 显示值 - 仅测试
Pstest.txt
switch
语句及其 -File
和 -Regex
参数进行基于 regex 的逐行处理:
& {
switch -Regex -File in.txt {
'^(.+), (\d+), (\d+)$' {
if ([int] $Matches.2 -gt [int] $Matches.3) {
$Matches.1 + ',T'
} else {
$_ # pass through
}
}
default { $_ } # pass through
}
} |
Set-Content out.txt
注:
上面假设所有以两个逗号分隔的十进制数字结尾的行都是感兴趣的。
Regex
^(.+), (\d+), (\d+)$
匹配这些行,并通过捕获组((...)
)捕获感兴趣的子字符串,结果反映在自动$Matches
变量中,其中$Matches.1
包含第一个捕获组的内容匹配,$Matches.2
第二个,依此类推。