我有一个我想阅读的文本文件,只有当行以特定字符开头时才使用powershell进行一些替换。
SAy我想将所有短划线( - )更改为'x',当且仅当行以y开头时。
我尝试使用命令
(Get-Content trial.log2) | Foreach-Object {$_ -replace "-", 'x'} | Set-Content trial.log2
然而,它实际上取代了所有出现的破折号,不仅仅是以y开头的行。
如果我想使用一个get content命令进行多次查找替换和字符串操作,是否也可以这样做?
我有另一个字符串操作,但只有它以F
开头如果行以F开头,则获取该行的前4个字符,然后追加'NEW',然后从字符20到30获取下一个字符。
如果行以y开头,则用X替换 - 。
$F=(get-content $file) -like 'F*'
(Get-Content $file) | Foreach-Object {
$_ -replace "^F.+", -join("$F".Substring(0,4), "$NEW3",
} | Set-Content trial.log2
Get-Content trial.log2 | ForEach-Object {
if ( $_ -match '^y' ) {
$_ -replace '-', 'X'
}
else {
$_
}
} | Set-Content trial.log3
但是,如果我这样做,文本会被写两次。我认为我如何寻找以F开头的线路有问题 任何帮助表示赞赏。谢谢!
答案 0 :(得分:1)
如下:
Get-Content trial.log2 | ForEach-Object {
if ( $_ -match '^y' ) {
$_ -replace '-', 'x'
}
else {
$_
}
} | Out-File trial.log2.temp
答案 1 :(得分:1)
您可以使用look-behind((?<=pattern)
)断言前面的字符在字符串开头后包含y
:
(Get-Content trial.log2) | Foreach-Object {$_ -replace '(?<=^y.*)-','x'} | Set-Content trial.log2