当 sed 中没有前面的冒号时,用换行符替换它的特定空格模式?



我正试图使用sed解析下面的一行,只有当空白不在冒号之前时,才用换行符替换空白。

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

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

我希望regex用换行符替换前面没有冒号的空白,因此输出如下:

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'中使用以下regex时,它会产生下面的输出,虽然很接近,但没有达到目标:

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

看起来regex还包括用换行符替换其他所有不是:的字符。

这应该做到:

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

输出:

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

干杯!

这可能对你有用(GNU sed(:

sed 'G;:a;s/([^: ]) (.*(.))/132/;ta;s/.$//' file

使用G命令将新行附加到当前行,默认情况下,该命令会将一个空的保留空间附加到模式空间。使用模式匹配和反向引用,在当前行中迭代,用附加的换行符替换后面跟着空格的非空格/非冒号字符。当没有进一步的匹配时,删除换行符并打印该行。

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

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

同样正如所指出的,最佳解决方案是:

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

最新更新