2017-06-19 84 views
1

我有.NC文件(文本文件),我需要改變基於他們linenumer和內容不同線路的巨量。更改和保存文件.NC

例子:

enter image description here

到目前爲止,我有:

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

我不知道您的期望$c = $c.GetType() | Format-Table -AutoSize做什麼,但它很可能不會做任何事是你希望。

如果我理解你的問題正確,你基本上要

  1. 刪除行pos
  2. S235JR2替換代碼S355J2,並
  3. 刪除部分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)修飾是允許多行字符串匹配的開始的行,否則^只會匹配字符串的開頭。


編輯:如果您需要在與4號線的文本3號線更換可變文本(因此複製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 
} 
+0

非常感謝!這非常有幫助。 – Noego

+0

刪除SI的部分工作非常流暢。 - 我的意思與線下更換的POS',是這裏的POS'寫入線(3號線)應與什麼是寫入行吹塑(4號線)所取代。難點在於,在第三行上它並不總是寫成'pos'。有時它有另一個詞,但在所有情況下,我希望這個詞被第四行中的代碼所取代。因此,我嘗試製作一系列文字,並互相交換拼布。也許你有解決方案? – Noego

+0

這太棒了。很滑。謝謝。 – Noego