每三次出现一个字符串

pot*_*ong 3 bash perl awk command-line sed

我有这样一个文件:

Sed eleifend orci eget odio
consequat. Sed sagittis ipsum
eget pulvinar. Sed ut lacus
Sed luctus sollicitudin ligula
varius neque. Sed tincidunt
Sed mauris egestas eget. Sed
Curae; Sed aliquam enim Sed,
Sed dictum quis sem. Sed
volutpat tincidunt. Sed lacus.
Run Code Online (Sandbox Code Playgroud)

我想将其转换为:

Sed eleifend orci eget odio
consequat. Sed sagittis ipsum
eget pulvinar. Sed Sed ut lacus
Sed luctus sollicitudin ligula
varius neque. Sed tincidunt
Sed Sed mauris egestas eget. Sed
Curae; Sed aliquam enim Sed Sed,
Sed dictum quis sem. Sed
volutpat tincidunt. Sed Sed lacus.
Run Code Online (Sandbox Code Playgroud)

Zai*_*aid 6

Perl one-liner可以通过使用/e修饰符来实现这一点,它允许基于逻辑的替换:

$ perl -pi.bak -e 'BEGIN{ $str = "Sed"; } s/(?<=$str)/ ++$cnt % 3 ? "" : " $str" /ge' file.txt
Run Code Online (Sandbox Code Playgroud)

说明

  • -pi.bak

    逐行就地编辑文件.备份存储在file.txt.bak中

  • BEGIN

    指定值$str,仅执行一次

  • s/PATTERN/REPLACEMENT/ge

    $_逐行替换所有匹配的正则表达式.REPLACEMENT评估为Perl代码.

  • (?<=$str)

    固定长度的后视断言

  • ++$cnt % 3 ? "" : " $str"

    每第三场比赛,追加" $str",否则不附加任何内容