我有大量的.nc文件(文本文件),我需要根据他们的布料和内容更改不同的行。
示例:
到目前为止,我有:
Get-ChildItem I:\temp *.nc -recurse | ForEach-Object {
$c = ($_ | Get-Content)
$c = $c -replace "S355J2","S235JR2"
$c = $c.GetType() | Format-Table -AutoSize
$c = $c -replace $c[3],$c[4]
[IO.File]::WriteAllText($_.FullName, ($c -join "`r`n"))
}
但这不起作用,因为它只向每个文件返回少量PowerShell行,而不是原始(已更改)内容。
答案 0 :(得分:0)
我不知道你期望$c = $c.GetType() | Format-Table -AutoSize
做什么,但它很可能不会做你期望的任何事情。
如果我理解你的问题,你基本上想要
pos
,S355J2
替换为S235JR2
和SI
(如果存在)。以下代码应该有效:
Get-ChildItem I:\temp *.nc -Recurse | ForEach-Object {
(Get-Content $_.FullName | Out-String) -replace 'pos\r\n\s+' -replace 'S355J2', 'S235JR2' -replace '(?m)^SI\r\n(\s+.*\n)+' |
Set-Content $_.FullName
}
Out-String
将输入文件的内容转换为单个字符串,菊花链替换操作会在将该字符串写回文件之前对其进行修改。表达式(?m)^SI\r\n(\s+.*\n)+
匹配以SI
开头的行,后跟一个或多个缩进行。 (?m)
修饰符允许在多行字符串中匹配起始行,否则^
只匹配字符串的开头。
编辑:如果您需要将第3行中的变量文本替换为第4行中的文本(从而复制第4行),那么您最好使用数组。延迟字符串数组的重整,直到替换之后:
Get-ChildItem I:\temp *.nc -Recurse | ForEach-Object {
$txt = @(Get-Content $_.FullName)
$txt[3] = $txt[4]
($txt | Out-String) -replace 'S355J2', 'S235JR2' -replace '(?m)^SI\r\n(\s+.*\n)+' |
Set-Content $_.FullName
}