我是 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
我想做的是就地编辑,在 92^
之后删除 N1^SE
段中的任何值。我试过了,但我似乎无法让它工作:
perl -i -pe 's/^N1\^SE\^\^92\^\d+$/N1^SE^^92^/g' Test
最终结果应该包括如下所示的 N1^SE
段:
N1^SE^^92^
当我在文件中只有一行时它起作用了:N1^SE^^92^1
。但是当我尝试在整个文件中全局替换时,它不起作用
谢谢。
最佳答案
您可能没有在此处复制一些隐藏的字符或空格。那些很可能在行的末尾,所以尝试
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
的术语“lookbehind”来自文档,但是,虽然 \K
清楚地“look behind”,但它标记了与正常的回顾断言的行为方式不同。
这是来自 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
关于regex - Perl 就地编辑 : Find and replace in X12850 formatted file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51867410/