2017-06-19 85 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