如何使用注释创建正则表达式搜索和替换?

时间:2015-11-20 13:42:48

标签: regex perl

我有一个奇怪的问题:我有一个代码(它的LaTeX,但这里没关系),包含句点(句子)的长行。 为了更好的版本控制,我想将这些句子分别换成新行。 这可以通过sed 's/\. /.\n/g'实现。

现在问题出现了,如果有潜在时期的评论。 这些注释不得更改,否则它们将被解析为LaTeX代码,这可能会导致错误等。

作为伪示例,您可以使用

Foo. Bar. Baz. % A. comment. with periods.

结果应为

Foo.
Bar.
Baz. % ...

或者,评论可能会在下一行没有任何问题。

如果可以更好地使用perl,则可以。我尝试了不同的程序(sedperl)一些想法,但没有一个做我的预期。评论也被更改或仅第一个时期被更改(perl -pe 's/^([^%]*?)\. /\1.\n/g')。

你能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:4)

这很棘手,因为你基本上试图匹配所有不遵循“%”的“。”。负面的后视在这里很有用,但Perl不支持可变宽度的负面后视。 (虽然在某些情况下有hideous ways of faking it。)我们可以在没有它的情况下使用回溯控制动词:

s/(?:%(*COMMIT)(*FAIL))|\.\K (?!%)/\n/g;

(?:%(*COMMIT)(*FAIL))强制更换以在第一次看到“%”时停止,通过提交匹配然后无条件失败,这会阻止反向跟踪。 “真实”匹配遵循交替:\.\K (?!%)查找一个句点后面的空格,后面跟不是“%”。 \K导致期间不包含在匹配中,因此我们不必将其包含在替换中。我们只匹配并替换空间。

答案 1 :(得分:1)

使用保留空间,可以很容易地使用sed将注释单独放在下一行:

ABC_1
ABC_2
...
ABC_1002

或者如果你想在其余部分之前自己发表评论:

sed '/^[^.]*%/b;/%/!{s/\. /.\n/g;b};h;s/[^%]*%/%/;x;s/ *%.*//;s/\. /.\n/g;G'

或者最后,也可以将评论与最后一行结合起来:

sed '/^[^.]*%/b;/%/!{s/\. /.\n/g;b};h;s/ *%.*//;s/\. /.\n/g;x;s/[^%]*%/%/;G'
相关问题