我想在最后一行之前的一行中附加/连接文本。所以如果我的原始文件是:
1 sometext
2 sometext
3 sometext
4 sometext
5 sometext
我的新文件是
1 sometext
2 sometext
3 sometext
4 sometext newtext
5 sometext
我已经知道如何插入换行符的解决方案,但这是一个稍微不同的问题,因为我不想插入新行,而是想要连接文本。
我想在最后一行之前的一行中附加/连接文本。所以如果我的原始文件是:
1 sometext
2 sometext
3 sometext
4 sometext
5 sometext
我的新文件是
1 sometext
2 sometext
3 sometext
4 sometext newtext
5 sometext
我已经知道如何插入换行符的解决方案,但这是一个稍微不同的问题,因为我不想插入新行,而是想要连接文本。
逐行反转文件,将文本添加到第二行,然后再次反转文件:
vim理解这样的地址
$-1
:ex
如同vim -e
输出
通过计数线和算术获取地址:
使用Raku(以前称为 Perl_6)
或者
样本输入:
示例输出(对于两个代码示例):
以上两个 Raku 代码示例代表了一个起点。我确信这些可以改进。使用
kv
键值编号的第一个示例(通常)改编自此 SO answer,而第二个示例(通常)改编自此 Perl(5)doc FAQ。例1:简单来说,
lines
就是读入并存储在@txt
数组中。使用(key-maximum) 标量获得行数elems
并将其分配给。$kmax
该@txt
数组被转换为kv
键值并读入一个for
循环,该循环实现了一个condition ?? $true !! $false
三元条件运算符。有关Raku 三元组的信息,请参阅此链接。使用所述三元运算符将文本附加到适当的$k == ($kmax-2)
(倒数第二)行。示例 2:这实际上是直接从 Perl5 代码改编而来的。不同之处在于 Raku 的
lines
例程处理打开/关闭文件句柄,并且也是惰性的。Raku 代码简单地实现了三个连续put
的(“print-using-\n-terminator”)语句,但不同之处(与 Perl5 相比)是文件行作为IO
对象读入,而不是从(大概bash
)命令行中读取.示例 2(续):第二个(中间)语句附加
" newtext"
到$_
主题变量(包含行文本),而第一个和第三个语句逐字打印之前/之后的文本。当然,可以将输出重定向到文件而不是输出到终端,例如通过附加> new_sometext.txt
到上面示例 2 代码的末尾。查看Perl(5)doc FAQ,我们看到 Perl5 中有许多用于解决此问题的模块。Raku(née Perl6)具有同源模块......这意味着在 Raku 中使用模块可以提供更简洁/高效的解决方案。
最后,如果您在将文件装入内存时遇到问题,并且/或者您更喜欢单独获取行数,您可以通过 Raku 单行来做到这一点:
然后简单地运行下面的代码,使用计算的(倒数第二个)行号
3
: