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

String Batch/Powershell替换文件中每行字符串的前2个字符,string,powershell,batch-file,replace,String,Powershell,Batch File,Replace,我有这样一个数据库: ...... CL8596 593005 CM3059 MADX0051 510043 MD0059 512128 MADX0088 ...... ...... CL8596 CLME3005 CM3059 MADX0051 MADE0043 MD0059 MADE2128 MADX0088 ...... 我需要做的是将以59或51开头的条目分别替换为“CLME”和“MADE”,这样看起来像这样: ...... CL8596 593005 CM3059 MADX0051

我有这样一个数据库:

......
CL8596
593005
CM3059
MADX0051
510043
MD0059
512128
MADX0088
......
......
CL8596
CLME3005
CM3059
MADX0051
MADE0043
MD0059
MADE2128
MADX0088
......
我需要做的是将以59或51开头的条目分别替换为“CLME”和“MADE”,这样看起来像这样:

......
CL8596
593005
CM3059
MADX0051
510043
MD0059
512128
MADX0088
......
......
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。

replace语句还支持正则表达式,因此以下代码可以工作:

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

replace语句还支持正则表达式,因此以下代码可以工作:

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

user3482697答案的一个更清晰、可读性更低的版本应该是这一行

(获取内容。\t.txt)|
ForEach对象{$\-replace'^51','MADE'-replace'^59','CLME'}
设置内容。\t.txt

您可以链接操作员
-替换
(以及其他人)。如果没有匹配项,则原始行将通过管道

一个更干净、可读性更低的user3482697版本的答案将是这一行

(获取内容。\t.txt)|
ForEach对象{$\-replace'^51','MADE'-replace'^59','CLME'}
设置内容。\t.txt

您可以链接操作员
-替换
(以及其他人)。如果没有匹配项,则原始行将通过管道

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

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

-replace
还可以作为数组操作符使用,因此您实际上不需要使用
foreach

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

非常感谢。你能解释一下$是什么意思,以及插入符号^51是什么意思吗?此外,为什么此代码不替换文件中的每个“59”和“51”?$\u是管道中的当前对象。在本例中,它是文件中的一行。它不会替换每个数字,因为它使用的是表示字符串开头的正则表达式锚。
$data | ForEach对象{$\u-replace'^51'、'make'-replace'^59'、'CLME'}
也适用于此谢谢!你能解释一下$是什么意思,以及插入符号^51是什么意思吗?此外,为什么此代码不替换文件中的每个“59”和“51”?$\u是管道中的当前对象。在本例中,它是文件中的一行。它不会替换每个数字,因为它使用的是表示字符串开头的正则表达式锚。
$data | ForEach对象{$\u-replace'^51'、'make'-replace'^59'、'CLME'}
也适用于此