Powershell 更改并保存.nc文件
我有大量的.nc文件(文本文件),需要根据行号和内容更改不同的行 例如: 到目前为止,我已经:Powershell 更改并保存.nc文件,powershell,Powershell,我有大量的.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
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行,而不是原始的(更改的)内容。我不知道您期望的是什么,
$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
}
我不知道您期望
$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
}
非常感谢你!这是非常有帮助的。移除带有SI的部分工作非常顺利。-我用下面的行替换“pos”的意思是,写“pos”的行(第3行)应该替换为第4行(第4行)。问题是,第三行并不总是写着“pos”。有时它有另一个单词,但在所有情况下,我希望该单词被第四行中的代码替换。所以,我尝试创建一个文本数组并相互交换行号。也许你有解决办法?这太棒了。太顺利了。谢谢。所以我不需要定义arry?它会自动这样做吗?脚本如何知道im引用的是行号?
Get Content
按照从文件中读取字符串的顺序返回字符串数组,因此数组索引是行号减去1。cmdlet周围的@(…)
确保即使文件为空或只有一行,结果也是数组。非常感谢!这是非常有帮助的。移除带有SI的部分工作非常顺利。-我用下面的行替换“pos”的意思是,写“pos”的行(第3行)应该替换为第4行(第4行)。问题是,第三行并不总是写着“pos”。有时它有另一个单词,但在所有情况下,我希望该单词被第四行中的代码替换。所以,我尝试创建一个文本数组并相互交换行号。也许你有解决办法?这太棒了。太顺利了。谢谢。所以我不需要定义arry?它会自动这样做吗?脚本如何知道im引用的是行号?Get Content
按照从文件中读取字符串的顺序返回字符串数组,因此数组索引是行号减去1。cmdlet周围的@(…)
确保即使文件为空或只有一行,结果也是一个数组。