gpt4 book ai didi

sed - 在模式上方添加回车两行

转载 作者:行者123 更新时间:2023-12-04 21:22:20 25 4
gpt4 key购买 nike

我有这样的数据库日志文件

tbl
---
tmp1
col1|col2
---------
22| 33
32| 45
tbl
---
tmp2
col1|col2| col3
---------------
22| 33| 123
32| 45| 456

我正在尝试编写一个 sed 命令来查找以用'---'并在上面两行添加一个回车符。所以这样输出看起来像:

tbl
---
tmp1

col1|col2
---------
22| 33
32| 45

tbl
---
tmp2

col1|col2| col3
---------------
22| 33| 123
32| 45| 456

是否可以使用 sed 来做到这一点?如果是怎么办?

最佳答案

方法一

按照 Sundeep 的建议使用 tac 反转输入使这个问题变得容易得多:

tac data.txt | sed '/^----*$/ {N;a\

}' | tac | sed '2,$p'

方法二

这是一个困难的仅限 sed 的问题(至少对我而言)。我很接近,但选择了 perl。 sed 是图灵完备的,因此绝对可以翻译。直觉上,我会说这可以用一个额外的行缓冲区来完成,我希望有人用一个 sed-only 实现来回答。有时它根本站不住脚。有太多奇怪的情况,我选择全程排队:

my @queue = ();

while (<>) {
if (/----*/) {
do {
print $queue[0];
print "\n" if scalar @queue == 2;
shift @queue;
} while (scalar @queue);
print;
} else {
push @queue, $_;
}
}
do print shift @queue while scalar @queue;

我开始像这样看待问题:

1
0
2
1
0

数字表示从后面的 ---* 行开始的偏移量,其中 0----* 行。当偏移量为 2 时,打印一个新行。

问题陈述明确表达为:
如果行 ~/----*/,则在上一行之前打印\n

无论如何,这是调用⟩/⟩输出:

$ perl script.pl data.txt
tbl
---
tmp1

col1|col2
---------
22| 33
32| 45

tbl
---
tmp2

col1|col2| col3
---------------
22| 33| 123
32| 45| 456

关于sed - 在模式上方添加回车两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53121702/

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