我一直在使用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
答案 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