[英]Is it possible (in sed) to remove a newline character only when preceding character isn't a dot?
[英]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.