2017-06-19 5 views
1

私は大量の.ncファイル(テキストファイル)を用意しています。リネンや内容に基づいて異なる行を変更する必要があります。.ncファイルを変更して保存します

例:

enter image description here

これまでのところ、私は持っている:それは、各ファイルに少数のPowerShellの行を返しますので、

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")) 
} 

これは、オリジナルの代わりに、しかし、動作していません(変更された)内容。

答えて

0

あなたが期待していることはわかりません。$c = $c.GetType() | Format-Table -AutoSizeは期待していることはほとんどありません。

私が正しくあなたの質問を理解していればあなたは、本質的に

  1. にそれが存在する場合、セクションSIを削除S235JR2でコードS355J2を交換し、
  2. 、ラインposを削除します。

次のコードは動作するはずです:

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で始まり、その後に1つ以上のインデントされた行が続く行と一致します。 (?m)修飾子は、複数行の文字列で一致する開始行を許可します。そうでない場合は、^は文字列の先頭にのみ一致します。


編集:あなたは確かにそのための配列を扱う方がいいでしょう第四ライン(したがって、第四行を複製する)からテキストと3行目で変数テキストを交換する必要がある場合。置換後まで文字列配列のマングリングを遅らせる:

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 
} 
+0

ありがとうございました!これは非常に役に立ちました。 – Noego

+0

SIでセクションを削除すると、非常にスムーズに動作します。 - 「pos」を下の行に置き換えることは、posが書かれた行(3行目)を行吹き(4行目)に書かれた行に置き換えなければならないことです。それが難しいのは、第3行目には常に「pos」と書かれているわけではないということです。時には別の言葉がありますが、私はその言葉を4行目のコードに置き換えたいと思っています。したがって、テキストの配列を作成し、行番号を相互に交換しようとしました。多分あなたはそれのための解決策を持っていますか? – Noego

+0

これは素晴らしいです。とてもスムーズです。ありがとうございました。 – Noego

関連する問題