替换不同字符串的一部分(perl,bash)

时间:2016-01-27 19:49:34

标签: bash perl sed wildcard

我想用几行替换csv文件中的文本:

输入:

any text,"textA, textB",any text

输出继电器:

any text, textA; textB,any text

(即:如果它位于两个引号之间,则用分号替换逗号,并删除引号)

我为textA和textB尝试了sed和通配符,但是无法在输出文件中打印textA和textB。 谢谢你的帮助!

5 个答案:

答案 0 :(得分:1)

$ sed -r 's/"([^"]+),([^"]+)"/\1;\2/g' file
any text,textA; textB,any text

答案 1 :(得分:0)

您可以使用gnu-awk:

cat file
any text,"textA, textB",any text

awk -v FPAT='"[^"]*"|[^,]*' -v OFS=, '{for(i=1; i<=NF; i++) {
     gsub(/,/, ";", $i); gsub(/"/, "", $i)}} 1' file
any text,textA; textB,any text

答案 2 :(得分:0)

您可以使用sed来匹配引号,然后捕获组以在第一个引用到逗号之后抓取文本(所有文本不是引号而不是逗号([^",]*),然后逗号后的文字直到收尾报价。

sed 's/\("\)\([^",]*\)\([,]\)\([^",]*\)\("\)/\2;\4/g' <<< 'any text,"textA, textB",any text'

答案 3 :(得分:0)

这可能适合你(GNU sed):

#inside-table span {
  position: relative;
  top: 50%;
  left: 50%;
}

如果线路保释中没有sed -r ':a;/"/!b;s//\n/;s//\n/;h;y/,/;/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2 \1/;ta' file 。否则,用换行符替换"的前两次出现,并在保留空间中复制。将任何"转换为模式空间中的,,然后将保留空间附加到模式空间,并使用模式匹配重新排列该行。如果替换成功,则重复直到所有;都被替换。

N.B。这预先假定所有"都匹配。

答案 4 :(得分:0)

使用(标准)T ext::ParseWords模块的Perl解决方案。

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use Text::ParseWords;

while (<DATA>) {
  my @data = map { s/,/;/g; $_ } parse_line(',', 0, $_);
  print join ',', @data;
}

__DATA__
any text,"textA, textB",any text