我有一个偶尔会有分割线的文件。线条以“+”开头(可能以空格开头)这一事实表明了分裂。
line 1
line 2
+ continue 2
line 3
...
我想加入拆分线:
line 1
line 2 continue 2
line 3
...
使用sed。我不清楚如何使用前面的加入一行。
有什么建议吗?
答案 0 :(得分:20)
这可能对您有用:
sed 'N;s/\n\s*+//;P;D' file
这些实际上是四个命令:
N
s/\n\s*+//
P
D
相关的手册页部分
答案 1 :(得分:3)
我不喜欢sed所以这对我来说是一个很好的挑战。
sed -n '1{h;n};/^ *+ */{s// /;H;n};{x;s/\n//g;p};${x;p}'
在awk中大概是这样的:
awk '
NR == 1 {hold = $0; next}
/^ *\+/ {$1 = ""; hold=hold $0; next}
{print hold; hold = $0}
END {if (hold) print hold}
'
如果最后一行是“+”行,则sed版本将打印一个尾随空白行。无法弄清楚如何抑制它。
答案 2 :(得分:3)
在sed中这样做肯定是一个很好的练习,但在perl中它非常简单:
perl -0777 -pe 's/\n\s*\+//g' input
答案 3 :(得分:2)
您可以在Ex模式下使用Vim:
g
-
全球搜索
j
选择上一行
x
加入下一行
public Vector2 InSquare(Vector2 vector)
{
int x = (int)vector.X, y = (int)vector.Y;//floor of vector coordinates
x -= x % SquareSize;
y -= y % SquareSize;
return new Vector2(x, y);
}
保存并关闭
答案 4 :(得分:2)
与GNU(经典?)sed一起使用保留空间的方式...基本上是在合并行之前将整个文件加载到保留空间中。
sed -n '1x;1!H;${g;s/\n\s*+//g;p}'
1x
在第一行中,将该行交换为空白的保留空间1!H
(非第一行),附加到保留空间$
在最后一行:
g
获取保留空间(整个文件)s/\n\s*+//g
替换+
之前的换行符p
打印所有内容输入:
line 1
line 2
+ continue 2
+ continue 2 even more
line 3
+ continued
成为
line 1
line 2 continue 2 continue 2 even more
line 3 continued
如果需要其他命令来进行数据的其他操作,则此(或potong的答案)可能比sed -z
的实现更有趣,您可以在1!H
之前插入它们,而在{{1} }立即将整个文件加载到模式空间。这意味着您在任何时候都不会操纵任何一行。与sed -z
相同。
换句话说,如果您还想消除以perl -0777
开头的注释行,请添加*
以删除该行
/^\s*\*/d
sed -n '1x;
/^\s*\*/d;
与之相对:
1!H;${g;s/\n\s*+//g;p}'
sed -z 's/\n\s*+//g;
前者在等待空间中逐行累积,使您处于经典的sed行处理领域,而后者的s/\n\s*\*[^\n]*\n/\n/g'
使您陷入麻烦的子字符串正则表达式中。
但是这有点极端,您总是可以将sed -z
用管道输送回sed中。因此+1。
用于Internet搜索的脚注:这是SPICE网表语法。
答案 5 :(得分:1)
适用于sed
版本的解决方案,该版本可以读取NUL分隔的数据,例如GNU Sed的-z
:
sed -z 's/\n\s*+//g'
与potong的解决方案相比,它的优点是能够连接以+
开头的多行。例如:
line 1
line 2
+ continue 2
+ continue 2 even more
line 3
成为
line 1
line 2 continue 2 continue 2 even more
line 3