regex - Perl 就地编辑 : Find and replace in X12850 formatted file

标签 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

我想做的是就地编辑,在 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/

相关文章:

javascript - 如何动态添加javascript正则表达式转义字符

javascript - 使用 JavaScript 查询正则表达式

r - 需要使用 R 从字符串列中提取单个字符

perl - 变量未在应用中更新

perl - 为什么 `use 5.005;` 有副作用?

windows - 如何在 Windows 上运行 rouge Summarization?

perl - 如何模拟来自 XS 的 &sname 调用?

python - 如何编写正则表达式来捕获特定的数字格式并排除其余的?

html - 输入字段接受任何字符,忽略正则表达式

perl - 如何在另一个perl脚本中调用有8个参数的子例程