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'}
也适用于此