1

我是 sed 命令的新手.....我正在尝试一些命令,但它总是在递归......在某些情况下它说“无法重新分配内存”

无限递归输出:

echo -e 'hell\nnautanki\nwtf' | sed -e '1h;1!H;$!d' -e 'x;l;D'

内存重新分配问题:

echo -e 'hell\nnautanki\nwtf'| sed -e '1h;1!H;$!d' -e 'x;D'

错误:

sed: couldn't re-allocate memory
4

1 回答 1

3

正如paulsm4所指出的,您已经创建了一个无限循环,它在每次迭代时分配内存,第一个示例只是第二个示例的较慢版本,由于打印,它最终也会出错couldn't re-allocate memory

让我们分解一下:

1h
1!H
$!d

将所有输入保存到保持空间,注意d开始下一个循环。

最后两个命令x; D仅在到达最后一行时执行。这是运行之前的情况:

PS: wtf
HS: hell\nnautanki\nwtf

x交换它们并D删除hell\n并重新启动循环,因为模式空间不为空。遗嘱在新的1!H模式空间上执行,结果是:

PS: nautanki\nwtf
HS: wtf\nnautanki\nwtf

即每次迭代时内存使用量略有增加。

有两行输入,情况有点不同:

PS: nautanki
HS: hell\nnautanki

变成:

PS: nautanki
HS: nautanki

以此类推到无穷大。

一行输入导致:

PS: hell
HS: hell

然后:

PS: 
HS: hell

就这样终止了。

于 2012-09-24T09:01:58.750 回答