Batch / Powershell 为文件中的每一行替换字符串中的前 2 个字符

Batch / Powershell replace first 2 characters from string for each line in file

我有这样的数据库:

......
CL8596
593005
CM3059
MADX0051
510043
MD0059
512128
MADX0088
......

我需要做的是分别用 'CLME' 和 'MADE' 替换以 59 或 51 开头的条目,这样它看起来像这样:

......
CL8596
CLME3005
CM3059
MADX0051
MADE0043
MD0059
MADE2128
MADX0088
......

我正在挠头,寻找解决方案,但似乎找不到任何东西。

到目前为止,我唯一的解决方案是以 MD0059 等字母开头的条目:

(Get-Content .\t.txt) | ForEach-Object { $_ -replace "md", "madr" } | Set-Content .\t.txt . 

这不适用于替换数字,因为一些条目已经包含“59”和“51”

提前致谢!

编辑:

此解决方案有效:

(Get-Content .\t.txt) | ForEach-Object -Process {
if ($_ -match '^51')
{
    $_ -replace '^51','MADE'   
}
elseif ($_ -match '^59')
{
    $_ -replace '^59','CLME'
}
else
{
    $_
}
} | Set-Content .\t.txt

谢谢用户3482697。

替换语句也支持正则表达式,所以下面的代码可以工作:

$data = $data | ForEach-Object -Process {
    if ($_ -match '^51')
    {
        $_ -replace '^51','MADE'   
    }
    elseif ($_ -match '^59')
    {
        $_ -replace '^59','CLME'
    }
    else
    {
        $_
    }
}

用户 3482697 的答案的一个更简洁且可读性较差的版本将是这个衬垫。

(Get-Content .\t.txt) |
    ForEach-Object{$_ -replace '^51','MADE' -replace '^59','CLME'} | 
    Set-Content .\t.txt

您可以链接运算符 -replace(以及其他运算符)。如果没有匹配项,则原始行通过管道

-replace 也可以用作数组运算符,因此您实际上并不需要 foreach

(Get-Content .\t.txt) -replace '^51','MADE' -replace '^59','CLME'|
 Set-Content .\t.txt