我有一个奇怪的问题:我有一个代码(它是 LaTeX,但在这里并不重要),其中包含带有句点(句子)的长行。
为了更好的版本控制,我想将这些句子分别放在一个新行上。
这可以通过 sed 's/\. /.\n/g'
来实现.
现在,如果评论也带有潜在句号,就会出现问题。 这些注释不得更改,否则它们将被解析为 LaTeX 代码,这可能会导致错误等。
作为一个伪示例,您可以使用
Foo. Bar. Baz. % A. comment. with periods.
结果应该是
Foo.
Bar.
Baz. % ...
或者,注释可以毫无问题地放在下一行。
使用perl
就可以了如果这样会更好的话。我尝试了不同的程序( sed
和 perl
)一些想法,但没有一个达到我的预期。要么评论也被更改,要么仅更改第一个句点 ( perl -pe 's/^([^%]*?)\. /\1.\n/g'
)。
你能指出我正确的方向吗?
最佳答案
这很棘手,因为您实际上是在尝试匹配所有不跟在“%”后面的“.”。负向后查找在这里很有用,但 Perl 不支持可变宽度负向后查找。 (尽管在某些情况下有 hideous ways of faking it。)我们可以使用回溯控制动词在这里没有它:
s/(?:%(*COMMIT)(*FAIL))|\.\K (?!%)/\n/g;
(?:%(*COMMIT)(*FAIL))
通过提交匹配然后无条件失败来强制替换在第一次看到“%”时停止,从而防止返回-追踪。 “真正的”匹配遵循交替:\.\K (?!%)
查找句点后面的空格且后面不跟“%”。 \K
导致句点不包含在匹配中,因此我们不必将其包含在替换中。我们只匹配和替换空格。
关于regex - 如何使用注释创建正则表达式搜索和替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33828197/