替换一个字符串,但只替换该字符串的第二个出现

时间:2017-10-23 21:17:26

标签: regex powershell replace

我在文件中有一些文字。

我使用Get-Content来读取文件,然后使用正则表达式-replace查找模式并替换内容。这是完美的,直到我遇到一种情况,我需要替换第二次出现的那个字符串,而不是第一次或任何后面的字符串(在这种情况下,它只显示两次)。

我想搜索"某些字符串来查找",然后只替换此字符串的第二次出现。我一直试图找到如何做到这一点的例子,但是已经做得很短。我可以找到如何替换部分字符串,但不能完全单独出现整个字符串。

这可以替换所有出现的字符串。

(gc file.txt) -replace "Some string to find", "some string changed") | sc file.txt

3 个答案:

答案 0 :(得分:0)

如果它不是变量并且它总是只是第一次跳过,你可以简单地做类似

的事情
mystring.substring(mystring.indexOf("string to match")).replace("string to match", "some string changed")

(例如)

答案 1 :(得分:0)

试试这个:

$find="world"
$replace="nice"
$string="the world is world, no?"
$pos=$string.IndexOf($find, $string.IndexOf($find)+1)

if ($pos -ne -1)
{
    "{0}{1}{2}" -f $string.Substring(0, $pos), $replace, $string.Substring($pos + $find.Length) 
}
else
{
   $string 
}

答案 2 :(得分:0)

如果你想替换文字的第二个单词,请尝试替换这样的(单词以查找使用ponctuation):

$find="world", "world.", "world;", "world," , "world?", "world!", "world:"
$replace="nice"
$string="the world is world, no?"
$array=$string -split " "
$Nbfounded=0
$result=""


foreach ($item in $array)
{
    $Founded=$false

    if ($item -in $find)
    {
       $Nbfounded++
       $Founded=$true 
    }


    if ($Founded -and $Nbfounded -eq 2)
    {
        $result=$result + ' ' + $replace
    }
    else
    {
        $result=$result + ' ' + $item
    }

}

$result.TrimStart()