我正试图使用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