加入当前和下一行,然后使用sed加入下一行及其后续行

时间:2017-04-28 21:36:30

标签: sed

鉴于输入:

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)咒语。

3 个答案:

答案 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

并且PD打印/删除模式空间中的第一行。

请注意,我们从未触及脚本的底部(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)。