我想知道如何按照自定义规则递归地缩进越来越多的诗行。例如
假设我们有:
OF Mans First Disobedience, and the Fruit
Of that Forbidden Tree, whose mortal tast
Brought Death into the World, and all our woe,
With loss of Eden, till one greater Man
Restore us, and regain the blissful Seat,
Sing Heav'nly Muse, that on the secret top
Of Oreb, or of Sinai, didst inspire
That Shepherd, who first taught the chosen Seed,
In the Beginning how the Heav'ns and Earth
Rose out of Chaos: Or if Sion Hill
Delight thee more, and Siloa's Brook that flow'd
Fast by the Oracle of God; I thence
Invoke thy aid to my adventrous Song,
That with no middle flight intends to soar
Above th' Aonian Mount, while it pursues
Things unattempted yet in Prose or Rhime.
And chiefly Thou O Spirit, that dost prefer
Before all Temples th' upright heart and pure,
Instruct me, for Thou know'st; Thou from the first
Wast present, and with mighty wings outspread.
我们想递归缩进它,在第一行之后的任何三行添加3个空格,以这种方式
OF Mans First Disobedience, and the Fruit
Of that Forbidden Tree, whose mortal tast
Brought Death into the World, and all our woe,
With loss of Eden, till one greater Man
Restore us, and regain the blissful Seat,
Sing Heav'nly Muse, that on the secret top
Of Oreb, or of Sinai, didst inspire
That Shepherd, who first taught the chosen Seed,
In the Beginning how the Heav'ns and Earth
Rose out of Chaos: Or if Sion Hill
Delight thee more, and Siloa's Brook that flow'd
Fast by the Oracle of God; I thence
Invoke thy aid to my adventrous Song,
That with no middle flight intends to soar
Above th' Aonian Mount, while it pursues
Things unattempted yet in Prose or Rhime.
And chiefly Thou O Spirit, that dost prefer
Before all Temples th' upright heart and pure,
Instruct me, for Thou know'st; Thou from the first
Wast present, and with mighty wings outspread
实现这一目标的最简单方法是什么?
如果您只想缩进第一行,然后每第四行缩进一次,您可以使用
awk
:或者
perl
:在这两种情况下,如果当前行号模块4 不等于 1,我们将在行首添加 4 个空格,这意味着我们将对除第 1 行、第 4 行等之外的所有行执行此操作。
在 awk 中,
NR
是行号,$0
是行的内容,所以NR % 4 != 1{$0=" "$0};
意思是“当当前行号模 4 不等于 1 时,在行首加 4 个空格”。final1;
只是“打印”的简写。在 Perl 中,
$.
是当前行号,s/old/new/
是替换运算符,它将替换第一次出现的old
withnew
。所以意思是“如果当前行号模 4 不等于 1,则用四个空格s/^/ / if $. % 4 != 1
替换行 () 的开头”。意思是“在应用由”提供的脚本后打印输入文件的每一^
行。-p
-e
这是完全相同的 perl 命令,但版本更详细且更易于理解:
或者,几乎相同:
使用Raku(以前称为 Perl_6)
自动打印(下面的前两个):
或者
或(非自动打印,以下两个)
或(非自动打印,无内部引号)
上面的 Raku 代码,前两个示例是 @terdon 的 Perl(5) 单行代码(
-pe
标志)的直接翻译。Raku$_
用作主题变量——与 Perl 相同。注意 Raku 摒弃了许多特殊变量,取而代之的是state
只初始化一次的变量。常用的state
变量包括$
递增/递减形式,例如$++
(匿名标量,此处用于计算行号)。最后两个示例是非自动打印(
-ne
标志),并使用 Raku 的“??
True!!
False ”三元运算符。这些形式在概念上类似于@Ed_Morton 的awk
代码(评论)。尝试在 Raku 三元的每一半中保留并行文本,但实际上,在输出$_
主题变量时您需要做的就是写入(如果未明确说明.put
,Raku 默认为主题变量)。$_
此外,put
在 Raku 中\n
为您添加了换行符。最后,Raku 中的很多引用问题都是使用“Q 语言”解决的,下面会引用它(上面的第四个单行代码中的示例使用
qq[…]
)。示例输出(所有 4 个单行,以上):
https://docs.raku.org/syntax/state
https://docs.raku.org/language/quoting
https://docs.raku.org/language/operators#index-entry-operator_ternary