Regex 在csv中替换双引号
我几乎遇到了以下问题,没有找到解决办法。这可能是我的CSV文件结构:Regex 在csv中替换双引号,regex,unix,csv,double-quotes,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个单引号替换“(i
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个单引号替换“
(inch)和“L”
双引号,如下例所示:
sed "s/$OLD/$NEW/g" $QFILE > $TFILE && mv $TFILE $QFILE
有人能帮我吗?也许这就是你想要的:
sed "s/\([0-9]\)\"\([^;]\)/\1''\2/g"
即:在数字([0-9]
)后面找到双引号(“
),但后面没有分号([^;]
),并用两个单引号替换
编辑:
我可以扩展我的命令(现在变得很长):
由于您使用的是SunOS,我想您不能使用扩展正则表达式(sed-r
)?因此,我这样做了:第一个s
命令将所有英寸“
替换为”
,第二个和第三个s
是相同的。它们替换了所有与不直接相邻的”
代码>与单个”
。我必须做两次才能替换第二个“
,例如“L”
,因为两个“
之间只有一个字符,而这个字符已经被\([^;]\)
匹配。这样,您还可以用'
替换'
。如果您有“
或”
等。您必须为“L”多放一个(但仅多放一个)s
,请尝试以下操作:
sed "s/\"L\"/'L'/g"
对于英寸,您可以尝试:
sed "s/\([0-9]\)\"\"/\1''\"/g"
我不确定这是不是最好的选择,但我已经尝试过了,而且效果很好。我希望这会有所帮助。更新(使用perl很容易,因为您可以获得全面的前瞻功能)
仅使用sed、grep
仅通过使用grep、sed(而不是perl、php、python等),不那么优雅的解决方案可以是:
输出-它为您的输入文件提供:
grep-o
基本上是通过;
- sed首先将行开头的“替换为”
- 然后用另一个替换行末尾的“替换”`
- 然后,它将所有剩余的双引号
“替换为单个”
“
放回开头和结尾您试过s/\“/\'/g吗?或者你只想替换“L”和英寸的双引号?我只想替换额外的双引号。sqlloader必须能够读取结果,并且某些字段可能包含;作为本文的一部分:(我没有perl可供使用,在SunOS 5.10中,grep没有-o选项:(这看起来几乎不错。所有英寸都被替换了。但“L”仍然是我的问题,在某些情况下,我还发现字段分隔符之间有一个“Rest”。:(你说“Rest”是什么意思?你能举个例子吗?在附加的doubleqoutes之间还有其他单词,因为它是源数据库中的一个自由文本/自由注释字段。所以它可以是“L”或“Rest”或“fippel pippel”或其他任何字符。@Karsten:我添加了一个更长的命令版本,现在应该可以工作了。Thx bmk。但是“L”和所有其他字符(如“fippel-pippel”)仍然是双引号。由于控制台上没有错误,我担心您的sed中有错误。我打开了这个页面,似乎有一个-r选项可用。这有助于简化您的语句吗?这两个看起来不错。但在某些情况下,我现在发现字段分隔符之间有一个“Rest”:(
sed "s/\([0-9]\)\"\"/\1''\"/g"
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
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