使用多行记录替换正则表达式

时间:2015-02-24 12:20:18

标签: regex powershell

我有两个文本文件,其中包含许多多行记录。我有三个任务需要完成:

  1. 将文本文件拆分为多行记录。
  2. 屏蔽多行记录中的某些字段,例如日期。
  3. 逐个字符地比较两个记录并返回任何差异。
  4. 我已完成第一项任务,使用以下正则表达式将文本文件拆分为多行记录: -

    $InputFile1 = get-content $File1 | out-string
    $Regex = '(?msi)(^0[56]00(?:[^\n]|\n(?!0[56]00|91|92))+)|^(91.{166})'
    $File1 = [regex]::matches($InputFile1, $Regex) | %{$_.value}
    

    这将返回从0500或0600开始的所有内容,直到遇到新记录或批量预告片。

    下一个任务是屏蔽记录中的某些字段。我认为在拆分文件后用替换字符串完成此步骤是可能的,但我不确定语法。也许有人可以给我一个类似表达的例子?建议也是受欢迎的,因为我可能会以错误的方式解决这个问题。

    示例记录: -

    050063475327800539226000   74008505059508054855173000000000228000000000000   000000018100344TESTING 1 RECORD SS14MULTILINE      BE 599900000     1009N99203 9 4 0100005
    0501            000000                                                          65684160       123456780000000000005 000000  1 510  POSV10080600015          000000000  
    050500000000000000000000001810034400        0000 000000018100N              1              000000000000000 0000000000000000    
    

    我想用******替换前25-30个字符。我使用的是使用.net正则表达式的powershell。

2 个答案:

答案 0 :(得分:1)

我认为这应该有效:

$InputFile1 = get-content $File1 | out-string
$Regex = '(?msi)(^0[56]00(?:[^\n]|\n(?!0[56]00|91|92))+)|^(91.{166})'
$File1 = [regex]::matches($InputFile1, $Regex) | %{$_.value -replace '^\d+\s+','*****'}

答案 1 :(得分:1)

这里有3个问题,所以你应该询问三个单独的问题。但是,听起来你已经解决了第一部分。我将回答第二部分,第三部分应该是一个不同的问题。

假设您的示例记录存储在一个文件中,并且该文件的每一行都是一条记录,您可以用以下内容替换每条记录的位置25-30:

$rfile = ".\records.txt"
$m = Get-Content $rfile

for($i = 0; $i -lt $m.length; $i++){ 
  $a = New-Object System.Text.StringBuilder $m[$i]; 
  (25..30) | % { $a[$_] = '*'} 
  $m[$i] = $a.tostring()  
}

$m | Set-Content $rfile

这会将文件加载到数组中。您可以迭代数组并为每一行创建一个StringBuilder对象。使用它,可以很容易地修改字符串的索引位置。

最后,您可以将修改后的数组内容写回文件,或者改为新文件。