Sed

如何替換括號之間的逗號

  • August 13, 2018

我有如下所示的文本文件:

12.com,128.15.8.6,TEXT1,no1,['128.15.8.6']
23com,122.14.10.7,TEXT2,no2,['122.14.10.7']
45.com,91.33.10.4,TEXT3,no3,['91.33.10.4']
67.com,88.22.88.8,TEXT4,no4,['88.22.88.8', '5.112.1.10']

因為我想使用 MySQL 命令將文件內容插入表中,說separated by ',',括號之間的 lat 字元串(可能包含用逗號分隔的字元串)導致 MySQL 想要分隔它們但 hte 表沒有足夠的列的問題。

[]我想用分號替換括號之間的逗號;

如何在 Linux 中以簡單的方式做到這一點?

編輯#1

方括號內分隔的字元串數,未定義。它可以是 1、2、3 等。,只要在括號內找到,我就需要用;.

sed可能也有效:

sed 'h; s/.*[[]/[/; s/,/;/g; x; s/[[].*//; G; s/\n// ' file

解釋:

sed '   h;          save the entire line to hold space 
       s/.*[[]/[/  remove anything till the opening `[`
       s/,/;/g     replace ALL commas with semicolons
       x           save modified bracketed text, get back original line 
       s/[[].*//   get rid of the bracketed text
       G           append the modified text
       s/\n//      remove the <newline> char introduced by `G`
' file

由於括號中的字元串總是以單引號為前綴,因此您可以像這樣簡單地替換這對:

$ sed "s/',/';/g" file
12.com,128.15.8.6,TEXT1,no1,['128.15.8.6']
23com,122.14.10.7,TEXT2,no2,['122.14.10.7']
45.com,91.33.10.4,TEXT3,no3,['91.33.10.4']
67.com,88.22.88.8,TEXT4,no4,['88.22.88.8'; '5.112.1.10']
67.com,88.22.88.8,TEXT4,no4,['88.22.88.8'; '5.112.1.10'; '1.2.3.4']
67.com,88.22.88.8,TEXT4,no4,['88.22.88.8'; '5.112.1.10'; '1.2.3.4'; '2.3.4.5']

處理 3 個或更少的替代方案

對於括號內的子字元串,長度不超過 3 ( ['xxx', 'yyy', 'zzz'])。您可以使用它sed來執行此操作:

$ sed 's/\([^\[]*\)\([^,]*\),\([^,]*\)/\1\2;\3/g' file
12.com,128.15.8.6,TEXT1,no1;['128.15.8.6']
23com,122.14.10.7,TEXT2,no2;['122.14.10.7']
45.com,91.33.10.4,TEXT3,no3;['91.33.10.4']
67.com,88.22.88.8,TEXT4,no4,['88.22.88.8'; '5.112.1.10']
67.com,88.22.88.8,TEXT4,no4,['88.22.88.8'; '5.112.1.10'; '1.2.3.4']

這個怎麼運作

在這個解決方案中是一個簡單的搜尋和替換s/.../.../g

  • s/\([^\[]*\)- 匹配所有[(零個或多個)並將其保存到\1
  • \([^,]*\)- 匹配所有內容,並將其保存到\2
  • ,- 匹配逗號
  • \([^,]*\)- 匹配所有不是逗號的內容並將其保存到\3
  • /\1\2;\3/g- 重建位,使其成為\1\2;\3現在,貪婪地這樣做

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