Powershell与Switch和Regex -基于下一行替换子字符串

vawmfj5a  于 2023-05-30  发布在  Shell
关注(0)|答案(1)|浏览(192)

我每天都要处理来自十个不同银行账户的财务系统中的文本文件(MT940)。为了能够改进银行对账单的处理,我想充实这些文件。基本上通过用其他东西替换银行交易代码(在本例中为NMSC)或对交易描述(:86:线)更可读。文件可能看起来像:

:20:
:25:MHCBNL2AXXX/0265515777
:28C:27/
:60F:C200207EUR100196,42
:61:2002070207D1326,80NMSCTOPF1450330305SDD TOPF1450330305
:86:FR601810010131670100ARVAL FRANCE BBB200210505254134245678815001141818
:61:2108240824D1976,72NMSCTOPF2140474819//GABK002SCT TOPF2123454819--AA--
:86:ABCWNLXXOBGNL953123450004107181ARIANA GRANDED127139012108000003Gehalt  8/2021--AA--
:61:2108240824D3581,11NMSCTOPF2140474818//GABK006SCT TOPF2140474818--BB--
:86:ABCANLWWXXXNL402011456789701498LADY GAGAD127139012108000002Gehalt  8/2021--BB--
:61:2108240824D3742,44NMSCTOPF2140474817//GABK004SCT TOPF2140474817--CC--
:86:CXWANLWWAT201456787210005293SHEERAN EDD127139012108000001Gehalt  8/2021--CC--
:61:2105250525D3742,44NMSCTOPF2025434704SCT TOPF2025434704
:86:CXWANLWWAT201456787210005293SHEERAN EDGCMS000039851534Salary
:61:2105250525D3581,11NMSCTOPF2025434705SCT TOPF2025434705
:86:ABCANLWWXXXNL402011456789701498LADY GAGAGCMS000039851545Salary
:61:2105250525D1976,72NMSCTOPF2025434706SCT TOPF2025434706
:86:ABCWNLXXOBGNL953123450004107181ARIANA GRANDEGCMS000039851576Salary
:62F:C200207EUR39752,98

我想做以下事情:
1.在以:61开头的行中:并且有SDD,我想用RDDT代替NMSC。
1.如果一行以:86:并且其中包含单词Salary或Gehalt,我想用SALA替换前一行(以:61:开头的行)中的NMSC。
我这样做是为了:

switch -Regex ($MT940)  
    {
    '^:61:[0-9]{1,6}.+D\d+\,?\d*NMSCTOPF\d+SDD TOPF\d*'        
    { $_ -replace  'NMSC' ,'RDDT' }
    '^:61:[0-9]{1,6}[0-9]{4}D[0-9]+\,[0-9]?[0-9]?NMSCTOPF\d+.+SCT.+'                 
    {$saved = $_ ; continue}
    '^:86:.+salar.+|^:86:.+Gehalt.+'       
    {$saved -replace "NMSC" , 'SALA' ;$_}  
    default                               
    { $_ } # unrelated line, pass through
    }

这给出以下结果:

>>:20:
>>:25:XXXXXXXXXXXXXXXXXXXXXXX
>>:28C:27
>>:60F:C200207EUR100000,00
>>:61:2012311231D0000,1RDDTTOPF1234567890SDD TOPF1234567890
>>:86:FR1234567890ARVAL FRANCE
>>:61:2108240824D0000,01SALATOPF2140474819//GABK002SCT TOPF2123454819--AA--
>>:86:ARIANA GRANDED12713901210Gehalt 8/2021--AA--
>>:61:2108240824D0000,01SALATOPF2140474818//GABK006SCT TOPF2140474818--BB--
>>:86:LADY GAGA127139012108000002Gehalt 8/2021--BB--
>>:61:2108240824D0000,01SALATOPF2140474817//GABK004SCT TOPF2140474817--CC--
>>:86:SHEERAN EDD127139012108000001Gehalt  8/2021--CC--
>>:61:2108240824D0000,01NMSCTOPF2025434704SCT TOPF2025434704      AA
**>>:61:2108240824D0000,01SALATOPF2140474817//GABK004SCT TOPF2140474817--CC--**
>>:86:SHEERAN EDGCMS000039851534Salary      AA
>>:61:2108240824D0000,01NMSCTOPF2025434705SCT TOPF2025434705      BB
**>>:61:2108240824D0000,01SALATOPF2140474817//GABK004SCT TOPF2140474817--CC--**
>>:86:ABCANLWWXXXNL402011456789701498LADY GAGAGCMS000039851545Salary      BB
>>:61:2108240824D0000,01MSCTOPF2025434706SCT TOPF2025434706      CC
**>>:61:2108240824D0000,01SALATOPF2140474817//GABK004SCT TOPF2140474817--CC--**
>>:86:ABCWNLXXOBGNL953123450004107181ARIANA GRANDEGCMS000039851576Salary      CC
>>:61:2012311231D0000,1RDDTTOPF0987654321SDD TOPF0987654321
>>:86:FR1234567890ARVAL FRANCE
>>:62F:C200207EUR39752,98

问:我不明白的是为什么在**之间插入了标记的行。

wj8zmpe1

wj8zmpe11#

显然,通过在末尾添加$来解决这个问题,表示行的结尾。

'^:61:[0-9]{1,6}[0-9]{4}D[0-9]+\,[0-9]?[0-9]?NMSCTOPF\d+.+SCT.+**$**'

我不明白为什么,它会导致其他线路(前两条:61:线)消失。

相关问题