鉴于输入:
1234
5678
9abc
defg
hijk
我喜欢输出:
12345678
56789abc
9abcdefg
defghijk
有很多例子使用sed(1)来连接一对线,然后是那对之后的下一对,依此类推。但是我还没有找到一个例子,它将第1行与第2行连接,3与3连接,4,......
优选sed(1)溶液。其他选项不太有趣 - 例如,awk(1),python(1)和perl(1)实现相当容易。我特意难以成功地使用sed(1)咒语。答案 0 :(得分:4)
sed '1h;1d;x;G;s/\n//'
我想可以通过其他方式完成,但这对我有用:
$ cat in
1234
5678
9abc
defg
hijk
$ sed '1h;1d;x;G;s/\n//' in
12345678
56789abc
9abcdefg
defghijk
它是如何工作的:我们把第一行放在空间里,这就是第一行。第一个之后的每一行 - 用保留空间交换它,将新保留空间附加到旧保留空间,删除换行符。
答案 1 :(得分:2)
这样做(现在由于potong的提示而得到改善):
$ sed -n 'N;s/\n\(.*\)/\1&/;P;D' infile
12345678
56789abc
9abcdefg
defghijk
详细说明:
N # Append next line to pattern space
s/\n\(.*\)/\1&/ # Make 111\n222 into 111222\n222
P # Print up to first newline
D # Delete up to first newline
替换使这两行
1111
2222
在模式空间中看起来像1111\n2222
到
11112222
2222
并且P
和D
打印/删除模式空间中的第一行。
请注意,我们从未触及脚本的底部(D
开始新的循环)直到最后一行,其中N
无法获取新行,会只是打印最后一行,如果我们没有用-n
来抑制它。
答案 2 :(得分:0)
调整另一个答案(完全归功于@aragaer)来处理单行输入(并且比原始版本更容易移植到bsd sed以及gnu sed - 更新:该答案已被编辑另一种便携性方式):
% cat >> inputfile << eof
12
34
56
eof
% sed -e '1{$p;h;d' -e '}' -e 'x;G;s/\n//' inputfile # bsd + gnu sed [1]
1234
3456
或
% cat joinsuccessive.sed
1{
$p;h;d
}
x;G;s/\n//
% sed -f joinsuccessive.sed inputfile
1234
3456
这是一个带注释的版本。
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 joinsuccessive.sed)。