Sed
如何替換括號之間的逗號
我有如下所示的文本文件:
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
現在,貪婪地這樣做