如何替换括号之间的逗号

如何替换括号之间的逗号

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

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

相关内容