PowerShell 中
Substring
的字符串长度属性可以使用负数吗?例如:
$str.Substring($startPos, -3)
我读到在 PowerShell 7 中可能已经添加了向后读取(“负值返回从输入字符串末尾开始请求的子字符串的数量”)但它看起来像是
Split
.
目前无法升级到v7。我在 v4 上。是否可以在版本 4 中执行此操作?
OR 是否有另一种在 PowerShell v4 中向后读取字符串的方法?
例子:
我需要替换
ABCD
,但由于逗号和缺乏一致的数据点,我很难找到一致的索引beforeABCD
。因此,为什么我使用 LastIndexOf
来找到最后一个逗号。现在,我希望我可以从最后一个逗号开始倒读 $replaceStr
的长度,如果这有意义的话。 $replaceStr.length
是我希望否定的。
$str = '12345,FOO FOO,ABCD,12351235'
$replaceStr = #code to get value of string that needs replaced
$str.Replace($str.Substring($str.LastIndexOf(',') + 1, $replaceStr.length), $Value)
尽量不要使代码过于复杂,如果通过拆分
,
将字符串转换为数组,然后更新倒数第二个标记,最后使用 ,
作为分隔符将其重新加入,您可能会发现它更容易:
$str = '12345,FOO FOO,ABCD,12351235'
$tokens = $str.Split(',')
$tokens[-2] = 'myNewValue'
$str = $tokens -join ','
$str # 12345,FOO FOO,myNewValue,12351235
LastIndexOf
有一个从给定索引开始的重载,因为搜索 backwards 朝向字符串的 start:
LastIndexOf(Char, Int32)
报告此实例中指定 Unicode 字符最后一次出现的从零开始的索引位置。搜索从指定的字符位置开始,然后向后搜索字符串的开头。
所以一旦你找到结尾
,
你可以从位置before搜索它来寻找上一个:
$str = "12345,FOO FOO,ABCD,12351235";
# find the last ","
$end = $str.LastIndexOf(",");
# 18
# find the one before that
$start = $str.LastIndexOf(",", $end - 1);
# 13
# extract the result just to prove it's right :-)
$value = $str.Substring($start + 1, $end - $start - 1);
# ABCD
要替换原来的字符串,您可以这样做:
$replace = "WXYZ";
$result = $str.Substring(0, $start + 1) + $replace + $str.Substring($end);
# 12345,FOO FOO,WXYZ,12351235
在您的特定情况下,由于数据是 CSV 文件,因此最好使用
Import-Csv
或 ConvertFrom-Csv
并让这些 cmdlet 处理所有围绕引用字符串、数据换行符和其他边缘情况的复杂规则这将打破上述LastIndeOf
方法。
例如,如果原始数据是这样的:
12345,FOO FOO,ABCD,"1235,1235"
你会得到错误的结果,因为最后一个逗号是 data 的一部分,而不是 syntax 所以不应该被匹配。