我有一个奇怪的问题:我有一个代码(它的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'
)。
你能指出我正确的方向吗?
答案 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'