在没有换行符的情况下,用换行符替换sed中的特定空格吗?

时间:2018-11-16 00:58:45

标签: regex sed

我试图使用sed解析以下行,仅在空格不在冒号之前时才用换行符替换空格。

例如,我正在使用以下输入进行处理:

label1: output label2: output2 label3: "output3" label4: output4 { label5: output5 label6: output6 } label7: output7 { { { label8: output8 } label9: output9 } } label10: output10

我希望正则表达式用换行符替换之前没有冒号的任何空白,因此输出将是这样的:

label1: output
label2: output2
label3: "output3"
label4: output4
{
label5: output5
label6: output6
}
label7: output7
{
{
{
label8: output8
label9: output9
}
}
label10: output10

当我尝试在cat file | sed 's/[^:A-Za-z0-9\"] /%/g' | tr '%' '\n'中使用以下正则表达式时,将导致以下输出,这接近但未达到目标:

    label1: output label2: output2 label3: "output3" label4: output4
    label5: output5 label6: output6
    label7: output7


    label8: output8
    label9: output9

    label10: output10

我也尝试过这个cat file | sed 's/[^:A-Za-z0-9\"] /%/g' | tr '%' '\n',结果是

label1: outpu
label2: output
label3: "output3
label4: output

label5: output
label6: output

label7: output



label8: output

label9: output


label10: output10

正则表达式看起来还包括用换行符替换不是:的所有其他字符。

2 个答案:

答案 0 :(得分:0)

这应该做到:

sed -E 's/([^:]) /\1\n/g' file

输出:

label1: output
label2: output2
label3: "output3"
label4: output4
{
label5: output5
label6: output6
}
label7: output7
{
{
{
label8: output8
}
label9: output9
}
}
label10: output10

干杯!

答案 1 :(得分:0)

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

sed 'G;:a;s/\([^: ]\) \(.*\(.\)\)/\1\3\2/;ta;s/.$//' file

使用G命令将换行符添加到当前行,默认情况下,该命令会将空的保留空间添加到模式空间。使用模式匹配和反向引用,在当前行中进行迭代,并通过附加的换行符替换一个非空格/非冒号字符,后跟一个空格。如果没有其他匹配项,请删除换行伪像并打印该行。

使用-r选项(仅适用于GNU sed)可以更容易地查看相同的解决方案,该选项可以消除许多反斜杠:

sed  -r 'G;:a;s/([^: ]) (.*(.))/\1\3\2/;ta;s/.$//' file

还指出,最佳解决方案是:

sed  's/\([^: ]\) /\1\n/g' file