我的文本文件包含G代码,代码“G94”在不同的行号上出现5次。
G94
G94
G94
G94
G94
我需要将“G94”的最后一次出现更改为
G94
/M16
但我一直没有编辑。
我正在尝试这个:
$text = get-content C:\cncm\g94.txt
$i = 1
$replace = 5 #Replace the 5th match
ForEach ( $match in ($text | select-String "G94" -AllMatches).matches)
{
$index = $match.Index
if ( $i -eq $replace )
{
$text.Remove($index,"G94".length).Insert($index,"G94 n /M16")
}
$i++
}
我错过了什么?
答案 0 :(得分:1)
$text
是一个字符串数组,如何在不获取异常的情况下调用Remove()
?首先因为Remove()
只接受一个参数,其次是因为你无法从固定长度的数组中删除。
我在想:
$text = get-content C:\cncm\g94.txt
$fifthMatch = ($text | select-string "G94" -AllMatches)[4]
$line = $text[$fifthMatch.LineNumber]
$line = $line.Remove($fifthMatch.index,"G94".length).Insert($fifthMatch.index,"G94 `n /M16")
$text[$fifthMatch.LineNumber] = $line
$text | out-file c:\cncm\g942.txt
答案 1 :(得分:0)
在包含整个文件的字符串上使用带有负向前瞻的regexp。
替换整个文件中的最后一次出现 - (?s)
DOTALL模式允许.*
跨越换行符:
$text = [IO.File]::ReadAllText('C:\cncm\g94.txt')
$text = $text -replace '(?s)G94(?!.*?G94)', "G94`n/M16"
替换每一行中的最后一次出现 - (?m)
MULTILINE模式:
$text = [IO.File]::ReadAllText('C:\cncm\g94.txt')
$text = $text -replace '(?m)G94(?!.*?G94)', "G94`n/M16"