Powershell 更改并保存.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

我有大量的.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行,而不是原始的(更改的)内容。

我不知道您期望的是什么,
$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周围的
    @(…)
    确保即使文件为空或只有一行,结果也是一个数组。