使用sed替换以任何数字开头的换行符

时间:2019-08-13 00:27:20

标签: sed

我一直在使用Google搜索,找不到有效的答案。我有一个文件,其中大多数行以字符串开头。但是,有几行以数字(长度不同)开头。我想使用sed从这些行中删除换行符,以便随后的数字和内容最终出现在前面的行中。

我在Mac上工作,所以在bash shell中工作。

示例:

Test 1,2,3,
41
Test 5,6,7,
8800
Test 9, 10
Test 11, 12

应该结束:

Test 1,2,3,41
Test 5,6,7,8800
Test 9, 10
Test 11, 12

5 个答案:

答案 0 :(得分:3)

简短的sed可以做到:

sed -zE 's/(,)[[:space:]]*[\n\r]+/\1/g'

sed参数明细:

  • -z:使用以null结尾的行允许sed搜索替换换行符。
  • -E:使用扩展的RegEx语法
  • 's/(,)[[:space:]]*[\n\r]+/\1/g':搜索,,后跟一些空格和任意数量的换行符或换行符,然后替换为捕获的,。结果是当最后一个,
  • 之后没有任何内容时,它将删除换行符和尾随空格。

产生的输出:

Test 1,2,3,41
Test 5,6,7,8800
Test 9, 10
Test 11, 12

答案 1 :(得分:2)

sed一次处理一行。可以使用它来连接行,但是一旦输出 而没有将以下行连接到该行,那就太晚了。

您可能会得到一个答案,建议您使用awk进行此操作,这的确可能会更好,但是由于您专门询问了sed,所以它是 可以将其用于此目的。有几种方法可以做到这一点。这应该与任何符合POSIX的sed一起使用:

 sed ':1; $ { s/\n\([0-9]\)/\1/g; n }; N; b1'

说明:sed表达式是一系列用分号分隔的命令,可以用以下命令更详细地表达(并带有解释性注释)

# Label for looping back to the start of this script
  :1

# If we're on the last line
$ {
    # Remove all newlines that are immediately followed by a digit
    s/\n\([0-9]\)/\1/g

    # Finish this sed cycle, printing the result (will terminate because no more lines)
    n
  }

# Append a newline to the pattern space, followed by the next line of input
  N

# jump to label 1
  b1

换句话说,它将吸收所有输入,然后一次性执行所有替换。尽管与他们的截然不同,但这是受到@LéaGris版本的启发。

答案 2 :(得分:2)

这可能对您有用(GNU sed):

sed 'N;/\n[0-9]/s/\n//;P;D' file

追加下一行,如果该行以数字开头,请删除换行符。打印,然后删除图案空间中的第一行并重复。

这不会将整个文件存入内存,但是最多只能在模式空间中保留两行。

答案 3 :(得分:1)

如果缺少数字的行以逗号,结尾,则可以执行以下操作:

awk '{printf /,$/?"%s":"%s\n",$0}' file
Test 1,2,3,41
Test 5,6,7,8800
Test 9, 10
Test 11, 12

根据行号或行尾的逗号打印换行符。

答案 4 :(得分:0)

如果还可以使用Perl。带有反向引用:

perl -0pe 's/\n(\d)/\1/g' file

具有前瞻性断言:

perl -0pe 's/\n(?=\d)//g' file

两种情况下的输出:

Test 1,2,3,41
Test 5,6,7,8800
Test 9, 10
Test 11, 12
相关问题