我是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
中只有一行时,它起作用了。但是当我尝试全局替换整个文件时,它不起作用
谢谢。
答案 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