簡體   English   中英

在沒有換行符的情況下,用換行符替換sed中的特定空格模式?

[英]Replacing a specific whitespace pattern in sed with a newline, when it doesn't have a preceding colon?

我試圖使用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'使用以下正則表達式時cat file | sed 's/[^:A-Za-z0-9\\"] /%/g' | tr '%' '\\n' 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' 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

看起來正則表達式還包括用換行符替換不是:所有其他字符。

應該這樣做:

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

干杯!

這可能對您有用(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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM