Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在csv中替换双引号_Regex_Unix_Csv_Double Quotes - Fatal编程技术网

Regex 在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

我几乎遇到了以下问题,没有找到解决办法。这可能是我的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个单引号替换
(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