如何在powershell中编辑特定字符串的最后一次出现

时间:2016-07-28 01:23:28

标签: powershell

我的文本文件包含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++
}

我错过了什么?

2 个答案:

答案 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"