在csv中替换doublequotes

Kar*_*ten 6 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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,有一些"是针对英寸和"L"封闭的".

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

sed "s/$OLD/$NEW/g" $QFILE > $TFILE && mv $TFILE $QFILE
Run Code Online (Sandbox Code Playgroud)

谁能帮我?

bmk*_*bmk 3

也许这就是你想要的:

sed "s/\([0-9]\)\"\([^;]\)/\1''\2/g"
Run Code Online (Sandbox Code Playgroud)

即:找到"数字 ( ) 后面[0-9]但后面没有分号 ( ) 的双引号 ( [^;]),并将其替换为两个单引号。

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

sed "s/\([0-9]\)\"\([^;]\)/\1''\2/g;s/\([^;]\)\"\([^;]\)/\1\'\2/g;s/\([^;]\)\"\([^;]\)/\1\'\2/g"
Run Code Online (Sandbox Code Playgroud)

由于您使用的是 SunOS,我猜您不能使用扩展正则表达式 ( sed -r)?因此我这样做了:第一个s命令将所有英寸替换"'',第二个和第三个命令s相同。他们将所有"不是 a 直接邻居的内容替换;为单个'。我必须执行两次才能替换第二个"eg "L",因为两者之间只有一个字符",并且该字符已经与 匹配\([^;]\)。这样您也可以替换""''. 如果你有"""""""等等,你必须再放一个(但只能再放一个)s