当前位置: 首页 > 知识库问答 >
问题:

sed和正则表达式替换',',除了在字符串中

鞠凌龙
2023-03-14

我有以下模式的输入

10,0,'string1_string2,_string3','',8,0,0,0.59,'20140101205216','20140128074836',584266915,5934

我想用sed将所有逗号“”字符替换为制表符。约束条件是不替换文本字符串中的“”(即'string1_string2,_string3''中的逗号不应替换为制表符)。这样做的正则表达式是,(?!,_)。

但是下面的sed不起作用。我也尝试了所有转义排列。

sed s/",\(\?\!,_\)"/"\t"/g 

有办法做到这一点吗?

共有3个答案

奚翰海
2023-03-14

如果可以的话,我建议使用Perl的帮助,因为有lookaround:

s="10,0,'string1_string2,_string3','',8,0,0,0.59,'20140101205216','20140128074836',584266915,5934"

perl -pe "s/,(?=(([^']*'){2})*[^']*$)/\t/g" <<< "$s"

10\t0\t'string1_string2,_string3'\t''\t8\t0\t0\t0.59\t'20140101205216'\t'20140128074836'\t584266915\t5934

PS:显示 \t 仅用于可读性目的。

鄢飞鸾
2023-03-14

您可以使用Text::ParseWords

perl -MText::ParseWords -n -l -e 'print join("\t", parse_line(",", 1, $_));' filename

对于您的输入,它将导致:

10      0       'string1_string2,_string3'      ''      8       0       0       0.59    '20140101205216'        '20140128074836'        584266915       5934
彭宏义
2023-03-14

在Mac OS X 10.9.1上,您可以使用:

sed -E -e "s/('[^']*'|[^,]*),/\1X/g"

除了用实际的选项卡替换X之外。对于您的输入行,它会产生:

10X0X'string1_string2,_string3'X''X8X0X0X0.59X'20140101205216'X'20140128074836'X584266915X5934

其中有X,你想要的选项卡。使用 GNU sed,你可以使用 -r 代替 -E(尽管它也可以识别 -E)。Mac sed 不会将 \t 扩展到选项卡;歌儒大学将会。使用 Bash,您可以使用 ANSI-C 引用机制让外壳在传递给 sed 的字符串中嵌入一个选项卡:

sed -E -e "s/('[^']*'|[^,]*),/\1"$'\t'"/g"

如果没有扩展正则表达式(由-r-Eawk

正则表达式查找单引号,后跟零个或多个非引号和单引号或零个或多个非逗号,后跟逗号,并将其替换为被记住为非此即彼的字符串和“tab”(使用 X 表示选项卡,因为它更明显)。

devnull指出上面的答案替换了行尾字符串中的逗号。有一种解决方法:

sed -E -e "s/('[^']*'|[^,]*)(,|$)/\1"$'\t'"/g; s/"$'\t'"$//"

分号前的s//g在每行末尾添加一个制表符;分号后的s///删除刚刚添加的制表符。

 类似资料:
  • 问题内容: 我正在尝试使用正则表达式替换字符串中所有出现的英国汽车登记信息。 当字符串与以下正则表达式完全匹配时,以下swift代码可完美地用于a。 结果是 但是,以下操作无效,并且字符串未修改 结果是 谁能给我任何指示? 问题答案: 您需要删除和锚点。 该装置 开始字符串 和手段 结束字符串 (或行,这取决于选项)。这就是第一个示例起作用的原因:在第一个测试字符串中,字符串的开头实际上是您的模式

  • 问题内容: 我有以下几种可能的形式的字符串: 我希望能够将它正则化为,基本上替换和之间的所有内容。我试过了: 但这是行不通的。任何帮助表示赞赏。 PS 表示有一个换行符用于此目的。实际上不在那里。 问题答案: 您可以使用 并替换为。请参阅在线Go regex演示。 在这里,匹配并捕获子字符串(它将从替换模式中引用此值),并将匹配并消耗除换行符以外的任何0+字符,直至行尾。 参见Go演示: 输出:

  • 本文向大家介绍正则表达式的字符串替换方法,包括了正则表达式的字符串替换方法的使用技巧和注意事项,需要的朋友参考一下 我有以下几行: d:\Projects\qqq\Development\qqq.MySol1.sln d:\Projects\qqq\qqqDevelopment\qqqMySol2.sln d:\Projects\qqq\Development\MyInstaller.sln d:

  • 我想使用Gson将字符串转换为Foo对象: 下面是我的正则表达式: 如何使用此正则表达式将所有,.和替换为,,而不更改JSON中的键和值?

  • 我试图匹配正则表达式模式来替换特定字符串。 示例文本:ABC/1111111 031111111/0318*12345678 我想用“/1222”替换03和18 in/0318,即(2022年12月)。我尝试了string replaceAll方法,但它替换了提供的示例字符串中所有匹配的字符。比如下面; 我尝试过的示例代码: 样本文本。替换(匹配器组(2),“12”); 样本文本。替换(匹配器组(

  • 我需要替换以下字符串中的引号。 最终输出应该是“这是test()ing和test()ing”; i、 e仅当它以“test()开头,以”结尾时才替换。中间的文本保持不变。 这个坏了。 请为同样的问题推荐合适的正则表达式。