我有如下所示的文本文件:
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 等。,
只要在括号内找到,我就需要将其替换为;
。
答案1
由于括号中的字符串始终以单引号作为前缀,因此您可以简单地替换该对,如下所示:
$ 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
现在的样子,贪婪地执行此操作
答案2
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
答案3
如果是最后一个字段并且列数是固定的,可以使用bash:
while IFS=, read v1 v2 v3 v4 rest; do
echo "$v1,$v2,$v3,$v4,${rest//,/;}"
done
结果:
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']
您可以将上述语句放在一个文件中(与#!/bin/bash
顶部一起)并将文件作为标准输入提供给该脚本,或者您可以在脚本中命名该文件:
while IFS=, read v1 v2 v3 v4 rest; do
echo "$v1,$v2,$v3,$v4,${rest//,/;}"
done < yourfile
这用于IFS
在 处分割线,
。前四个字段分配给 v1..v4,而之后的所有字段都分配给最后一个变量,此处称为rest
。 echo 然后输出由 分隔的变量,
,而在最后一个变量中它被替换为;
。
答案4
awk 在这里非常好:使用开括号作为字段分隔符并替换第二个字段中的所有逗号。
awk 'BEGIN {FS = OFS = "["} {gsub(/,/, ";", $2)} 1' file