Perl就地编辑:查找并替换为X12850格式的文件

时间:2018-08-15 22:40:42

标签: regex perl

我是Perl的新手,无法解决这个问题。我有一个名为 Test 的文件:

ISA^00^          ^00^          ^01^SupplyScan     ^01^NOVA           ^180815^0719^U^00204^000000255^0^P^^
GS^PO^SupplyScan^NOVA^20180815^0719^00000255^X^002004
ST^850^00000255
BEG^00^SA^0000000059^^20180815
DTM^097^20180815^0719
N1^BY^^92^
N1^SE^^92^1
N1^ST^^92^
PO1^1^4^BX^40.000^^^^^^^^IN^131470^^^1^
PID^F^^^^CATH 6FR .070 MPA 1 100CM
REF^
PO1^2^4^BX^40.000^^^^^^^^IN^131295^^^1^
PID^F^^^^CATHETER 6FR XB 3.5
REF^
PO1^3^2^EA^48.000^^^^^^^^IN^132288^^^1^
PID^F^^^^CATH 6FR AL-1 SH
REF^
PO1^4^2^BX^48.000^^^^^^^^IN^131297^^^1^
PID^F^^^^CATHETER 6FR .070 JL4SH 100CM
REF^
CTT^4^12
SE^20^00000255
GE^1^00000255
IEA^1^00000255

我要执行的是就地编辑,将N1^SE段中92^段中的所有值都删除。我尝试了这个,但似乎无法实现:

perl -i -pe 's/^N1\^SE\^\^92\^\d+$/N1^SE^^92^/g' Test

最终结果应包括N1^SE段,如下所示: N1^SE^^92^

当我在文件N1^SE^^92^1中只有一行时,它起作用了。但是当我尝试全局替换整个文件时,它不起作用

谢谢。

1 个答案:

答案 0 :(得分:2)

您可能想念一些隐藏的字符或空格。这些很可能在行尾,所以尝试

perl -i -pe 's/^N1\^SE\^\^92\^\K.*//' Test

\K是“ positive lookbehind”的一种特殊形式,它会丢弃所有先前的匹配项,因此仅.*之后的{其余部分}被替换删除。

这很认真地要求“ 在...后放任何值……”,因为它使行与问题示例中唯一的\d以外的其他行匹配。

或使用\Q...\E序列转义特殊字符(请参见quotemeta

perl -i -pe 's/^\QN1^SE^^92^\E\K.*//' Test

根据Borodin的评论。

另一种方法是像问题中那样具体匹配\d

s/^N1\^SE\^\^92\^\K\d+//

每个ikegami的评论。这适用于您的模式,并且不会删除行尾可能隐藏的内容。


\K的术语“向后看”来自文档,但是\K显然是“向后看”,它与普通的向后断言的行为方式有明显区别。

这是ikegami中一个引人注目的示例。比较

perl -le'print for "abcde" =~ /(?<=\w)\w/g'  # prints lines: b c d e

perl -le'print for "abcde" =~ /\w\K\w/g'     # prints lines: b d