gpt4 book ai didi

sed - 使用 sed 只删除文件的中间部分

转载 作者:行者123 更新时间:2023-12-04 16:25:36 24 4
gpt4 key购买 nike

我想将 sed 用作管道的一部分,以仅保留其输入的前 10 行和后 10 行。它不会处理物理文件,而只是从 STDIN 读取并输出到 STDOUT。 stream 中的数据量大于机器 RAM(或其磁盘空间),因此需要相对高效。它还必须在流模式下工作,而不会创建临时文件(没有可写文件系统)。

如果它可以显示一行而不是它删除的所有中间部分,则额外奖励:

例如,如果我的输入行包含从 1 到 100000 的数字,我需要它来输出(带有文字 <cut> 文本的行会很好,但它是可选的):

1
2
3
4
5
6
7
8
9
10
<cut>
99991
99992
99993
99994
99995
99996
99997
99998
99999
100000

我想出的最好办法是让它输出前 10 行,最后 1 行:

yes ' ' | head -n 100000 |nl | \
sed -e '$q;11,$d'`

哪些输出

     1   
2
3
4
5
6
7
8
9
10
100000

但我也需要它在数据末尾输出更多上下文(10 行而不是 1 行)。

更新:输入流的长度未知且会变化,100000以上只是一个例子。

更新:如问题和标签中所述,我需要在 sed 中使用它,而不是 awk、perl 或其他更容易完成的编程语言(这个要求,连同没有 tmp 文件,是因为它是嵌入式系统,可用的命令和资源有限)

更新:如果输入少于 10+10 行,理想情况下应该只打印整个输入

最佳答案

您可以尝试以下命令:

sed -n 'H; 1,10 { p; b }; g; s/\n[^\n]*//; h; $ { s/\n/<cut>\n/; p }'

有两个 block 来保存内容,pattern spacehold space。第一个用于解析当前行,第二个可以用作备份。该方法是在保留空间 中保存最后处理的十行。

H将每一行保存到保留空间g恢复 hold space,然后删除最旧的行并再次保存到 hold space,并在最后一行 ( $ ) 打印,在它前面添加你的魔法词。 p>

整个命令:

yes ' ' | head -n 100000 |nl|\
sed -n 'H; 1,10 { p; b }; g; s/\n[^\n]*//; h; $ { s/\n/<cut>\n/; p }'

产量:

     1   
2
3
4
5
6
7
8
9
10
<cut>
99991
99992
99993
99994
99995
99996
99997
99998
99999
100000

然后说,遵循 Ed Morton 的建议,因为 几周后更容易调试或修改。


更新:

您可以在前十行之后追加到保留空间,并在删除最旧的 FIFO 结构之前检查其中是否有超过 10 个换行符:

sed -n '1,10 { p; b }; H; g; /\(\n[^\n]\+\)\{11\}/ s/\n[^\n]*//; h; $ { s/^\n//; p }'

现在知道在哪里添加 <cut> 更具挑战性字符串在 20 个输入行的边缘情况下,但我会把它留给你作为练习。

关于sed - 使用 sed 只删除文件的中间部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36559157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com