我有两个文本文件,其中包含许多多行记录。我有三个任务需要完成:
我已完成第一项任务,使用以下正则表达式将文本文件拆分为多行记录: -
$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。
答案 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
对象。使用它,可以很容易地修改字符串的索引位置。
最后,您可以将修改后的数组内容写回文件,或者改为新文件。