Text-Processing

用 sed 替換四次

  • March 18, 2019

我想替換這個字元串中的第二個、第三個、第四個和第五個點

2019-03-17T11:32:28.143343Z;1234.5678;901.234;567.89012;3456.78;192.168.0.1

用逗號,得到這個結果:

2019-03-17T11:32:28.143343Z;1234,5678;901,234;567,89012;3456,78;192.168.0.1

第一個逗號和第六個逗號(以及之後的任何逗號)應該保持不變。

我找到了這個命令,我可以執行多次(但可能不是最佳實踐):

echo "$tmp" | sed 's/\./\,/2'

我怎樣才能在一個命令中完成這項工作?

您的數據由六個;分隔的欄位組成,您想用逗號替換欄位 2 到 5(不是 1 或 6)中的點。

這是最容易完成的awk

awk -F ';' 'BEGIN { OFS=FS } { for (i=2; i<=5; ++i) gsub("\\.", ",", $i); print }' file

使用給出的範例數據,這會產生

2019-03-17T11:32:28.143343Z;1234,5678;901,234;567,89012;3456,78;192.168.0.1

程式碼只是迭代;每個輸入行的 -delimited 欄位,並呼叫gsub()對循環迭代的各個欄位進行全域搜尋和替換(就像您使用s/\./,/gor y/./,/in所做的那樣sed)。

然後列印修改後的行。

-F選項將輸入欄位分隔符設置為分號,我們使用該BEGIN塊也將輸出欄位分隔符設置為相同的值(否則您將獲得以空格分隔的欄位)。


使用sed,您可能會執行類似的操作

sed 's/\./,/2; s/\./,/2; s/\./,/2; s/\./,/2' file

即,將第二個點替換四次(第二個點會隨著每次替換而改變,因為你替換了它們)。然而,這確實假設每個欄位中的值的數量保持不變。

要解決此問題,以防您在某個欄位中有兩個以上以點分隔的內容,您可以這樣做

sed 'h; s/^[^;]*;//; s/;[^;]*$//; y/./,/; G;H;x; s/;[^\n]*\n/;/; s/\n.*;/;/' file

簡而言之,這些命令確實

  1. 將原始行複製到保留空間。

  2. 刪除模式空間中的第一個和最後一個欄位。

  3. 將模式空間中的所有點更改為逗號(這就是y命令)。所有應該變成逗號的點現在都被改變了。現在我們必須從模式空間中的中間位和保持空間中的原始數據重新組合行。

  4. 使 (with G;H;x) 模式空間包含

  5. 原始字元串,後跟換行符,

  6. 修改後的中間位,後跟換行符

  7. 又是原來的字元串。

  8. 所以現在模式空間包含三行。刪除除第一行的第一個欄位和換行符之外的所有內容,並將刪除的位替換為;.

  9. 對最後一行做類似的事情,即刪除(現在唯一的)換行符和最後一行的所有內容;,並替換為;.

  10. 完畢。

或者你可以只使用awk程式碼。

引用自:https://unix.stackexchange.com/questions/506807