使用sed连接当前行和下一行,然后连接下一行及其后续行

使用sed连接当前行和下一行,然后连接下一行及其后续行,sed,Sed,根据输入: 1234 5678 9abc defg hijk 我想要输出: 12345678 56789abc 9abcdefg defghijk 有很多例子使用sed(1)连接一对线,然后连接该对线之后的下一对线,依此类推。但我还没有找到一个例子,连接线1与2,2与3,3与4 首选sed(1)溶液。其他选项则不那么有趣——例如,awk(1)、python(1)和perl(1)实现相当简单。我被一个成功的sed(1)咒语难住了。这就做到了(现在改进了,多亏了的提示): 详细内容: N#将下一

根据输入:

1234
5678
9abc
defg
hijk
我想要输出:

12345678
56789abc
9abcdefg
defghijk
有很多例子使用sed(1)连接一对线,然后连接该对线之后的下一对线,依此类推。但我还没有找到一个例子,连接线1与2,2与3,3与4

首选sed(1)溶液。其他选项则不那么有趣——例如,awk(1)、python(1)和perl(1)实现相当简单。我被一个成功的sed(1)咒语难住了。

这就做到了(现在改进了,多亏了的提示):

详细内容:

N#将下一行追加到模式空间
将111\n222转换为111222\n222
打印到第一个换行符
D#删除到第一个换行符
替换使这两行

1111
2222
模式空间中的哪个看起来像
1111\n2222
into

11112222
2222
以及
p
D
从图案空间打印/删除第一行

请注意,直到最后一行,
N
无法获取新行,只会自己打印最后一行,如果我们不使用
-N

来抑制它,我们就不会到达脚本的底部(
D
开始一个新循环)(现在改进了,感谢的提示):

详细内容:

N#将下一行追加到模式空间
将111\n222转换为111222\n222
打印到第一个换行符
D#删除到第一个换行符
替换使这两行

1111
2222
模式空间中的哪个看起来像
1111\n2222
into

11112222
2222
以及
p
D
从图案空间打印/删除第一行


请注意,直到最后一行,
N
无法获取新行,并且如果我们没有使用
-N
抑制最后一行,则只会自己打印最后一行,我们才开始脚本的底部(
D
启动新循环);1d;x;Gs/\n/'

我想可以用其他方法,但这对我来说很有效:

$ cat in
1234
5678
9abc
defg
hijk
$ sed '1h;1d;x;G;s/\n//' in
12345678
56789abc
9abcdefg
defghijk

工作原理:我们把第一行放在第一行来容纳空间,这就是第一行。第一行之后的每一行-将其与保留空间交换,将新保留空间附加到旧保留空间,删除换行。

sed'1h;1d;x;Gs/\n/'

我想可以用其他方法,但这对我来说很有效:

$ cat in
1234
5678
9abc
defg
hijk
$ sed '1h;1d;x;G;s/\n//' in
12345678
56789abc
9abcdefg
defghijk
工作原理:我们把第一行放在第一行来容纳空间,这就是第一行。第一行之后的每一行-用保留空间交换,将新保留空间附加到旧保留空间,删除换行。

调整另一个答案(完全归功于@aragaer)以处理单行输入(与原始版本相比,bsd sed和gnu sed的可移植性更强-更新:该答案已以另一种可移植性方式编辑):

这是一个带注释的版本

1{                # special case for first line only:
 $p               #  even MORE special case: print current line for input with
                  #  only a single line
 h                # add line 1 to hold space (for joining with successive lines)
 d                # delete pattern space and move to next line (without printing)
}
x                 # for lines 2+, swap pattern space (current line) and hold space
G                 # add newline + hold space (now has current line) to pattern space
                  # (previous line) giving prev line, newline, curr line in pattern
                  # space (and curr line is in hold space)
s/\n//            # remove newline added by G (between lines) before printing the
                  # pattern space
[1] bsd sed(1)希望右大括号单独在一行上。使用-e“构建”脚本或将命令放入sed脚本文件(并使用-f.sed)。

调整另一个答案(完全归功于@aragaer)以处理单行输入(与原始版本相比,bsd sed和gnu sed的可移植性更强-更新:该答案已以另一种可移植性方式编辑):

这是一个带注释的版本

1{                # special case for first line only:
 $p               #  even MORE special case: print current line for input with
                  #  only a single line
 h                # add line 1 to hold space (for joining with successive lines)
 d                # delete pattern space and move to next line (without printing)
}
x                 # for lines 2+, swap pattern space (current line) and hold space
G                 # add newline + hold space (now has current line) to pattern space
                  # (previous line) giving prev line, newline, curr line in pattern
                  # space (and curr line is in hold space)
s/\n//            # remove newline added by G (between lines) before printing the
                  # pattern space


[1] bsd sed(1)希望右大括号单独在一行上。使用-e“构建”脚本或将命令放入sed脚本文件(并使用-f joinSessional.sed)。

Nice!在任何情况下都比我的优雅;)使用bsd sed失败:
sed:1:“1{h;d};x;G;s/\n/”:d命令末尾的额外字符
我正在尝试找出是否有办法使用bsd sed实现这一点。对于gnu sed来说,这个版本比@Benjamin W.的verison(在一个有一百万行的文件上测试)要高效得多。从手册页上看,“终止”}必须以换行符开头。使用-e构建sed脚本应该可以做到:
sed-e'1{h;d'-e'}'-e'x;G;s/\n/'
。那太好了。现在,对于一个只有一行的输入文件来说,退化的情况如何?很好!在任何情况下都比我的更优雅;)在bsd sed时失败:
sed:1:“1{h;d};x;G;s/\n”:d命令末尾的额外字符
我正在尝试找出是否有办法使用bsd sed实现这一点。对于gnu-sed来说,这个版本比@Benjamin W.的verison(在一个有一百万行的文件上测试)要高效得多。从手册页上看,“终止“}”必须前面加新行。使用-e构建sed脚本应该做到这一点:
sed-e'1{h;d'-e'}'-e'x;Gs/\n/'
。太好了。现在,对于一个只有一行的输入文件,退化情况如何?也许你的答案可以改为
sed-n'n;s/\n\(.*)/\1&;PD'文件
但正如您所指出的
sed'1h;1d;x;Gs/\n/'文件
看起来更优雅。原始版本在使用bsd sed时失败。版本2与gnu sed或bsd sed一起使用。很好,这是因为BSD sed使得在替换中插入换行变得很困难;在
&
中嵌入换行符确实可以解决这个问题。只是指出而已。谢谢你的更新版本。也许你的答案可以改成
sed-n'n;s/\n\(.*)/\1&;PD'文件
但正如您所指出的
sed'1h;1d;x;Gs/\n/'文件
看起来更优雅。原始版本在使用bsd sed时失败。版本2与gnu sed或bsd sed一起使用。很好,这是因为BSD sed使得在替换中插入换行变得很困难;在
&
中嵌入换行符确实可以解决这个问题。只是指出而已。谢谢你的更新版本。