使用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使得在替换中插入换行变得很困难;在&
中嵌入换行符确实可以解决这个问题。只是指出而已。谢谢你的更新版本。