sed:根据第二个连接线

时间:2012-04-03 19:20:36

标签: sed

我有一个偶尔会有分割线的文件。线条以“+”开头(可能以空格开头)这一事实表明了分裂。

line 1
line 2
  + continue 2
line 3
...

我想加入拆分线:

line 1
line 2 continue 2
line 3
...

使用sed。我不清楚如何使用前面的加入一行。

有什么建议吗?

6 个答案:

答案 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
  1. -全球搜索

  2. j选择上一行

  3. x加入下一行

  4. 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