替换csv中的双引号

时间:2011-05-12 14:46:10

标签: regex unix csv double-quotes

我几乎遇到了以下问题但未找到解决方案。这可能是我的CSV文件结构:

1223;"B630521 ("L" fixed bracket)";"2" width";"length: 5"";2;alternate A
1224;"B630522 ("L" fixed bracket)";"3" width";"length: 6"";2;alternate B

正如您所看到的,在封闭的"中有一些"L"代表英寸和"

现在我正在寻找一个UNIX shell脚本,用2个单引号替换"(英寸)和"L"双引号,如下例所示:

sed "s/$OLD/$NEW/g" $QFILE > $TFILE && mv $TFILE $QFILE

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

也许这就是你想要的:

sed "s/\([0-9]\)\"\([^;]\)/\1''\2/g"

I.e。:在数字(")后面找到双引号([0-9]),但后面没有分号([^;]),并用两个单引号替换它。

编辑: 我可以扩展我的命令(它现在变得很长):

sed "s/\([0-9]\)\"\([^;]\)/\1''\2/g;s/\([^;]\)\"\([^;]\)/\1\'\2/g;s/\([^;]\)\"\([^;]\)/\1\'\2/g"

当您使用SunOS时,我猜您无法使用扩展正则表达式(sed -r)?因此我这样做:第一个s命令用"替换所有英寸'',第二个s和{3}}相同。他们将"的所有;替换为'一个"。我必须做两次才能替换第二个"L"例如"因为\([^;]\)之间只有一个字符,且此字符已与""匹配。这样您也可以将''替换为"""。如果您有""""s等,则必须再放一个(但只有一个){{1}}。

答案 1 :(得分:3)

更新(使用perl很简单,因为你获得了完整的超前功能)

perl -pe 's/(?<!^)(?<!;)"(?!(;|$))/'"'"'/g' file

<强>输出

1223;"B630521 ('L' fixed bracket)";"2' width";"length: 5'";2;alternate A
1224;"B630522 ('L' fixed bracket)";"3' width";"length: 6'";2;alternate B

使用sed,仅限grep

只需使用grep,sed(而不是perl,php,python等),不那么优雅的解决方案可以是:

grep -o '[^;]*' file | sed  's/"/`/; s/"$/`/; s/"/'"'"'/g; s/`/"/g' 

输出 - 输入文件为:

1223
"B630521 ('L' fixed bracket)"
"2' width"
"length: 5'"
2
alternate A
1224
"B630522 ('L' fixed bracket)"
"3' width"
"length: 6'"
2
alternate B
  • grep -o基本上将输入分为;
  • sed首先用'
  • 替换“行首”
  • 然后它取代“在另一端的行尾”
  • 然后将所有剩余双引号"替换为单'
  • 最后它将所有"放回到开头和结尾

答案 2 :(得分:2)

对于“L”,试试这个:

 sed "s/\"L\"/'L'/g"

对于英寸,您可以尝试:

sed "s/\([0-9]\)\"\"/\1''\"/g" 

我不确定这是最好的选择,但我已经尝试过并且有效。我希望这有用。