我试图使用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
正则表达式看起来还包括用换行符替换不是:
的所有其他字符。
答案 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