6

我几乎遇到了以下问题,但没有找到解决方案。这可能是我的 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

正如你所看到的,有一些"写成 inch 和"L"附在".

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

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

谁能帮我?

4

3 回答 3

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 首先用 ` 替换行首的 "
  • 然后它用另一个 ` 替换行尾的 "
  • 然后它用单引号替换所有剩余的双引号"'
  • 最后它把所有"的开始和结束都放回去了
于 2011-05-12T15:47:56.500 回答
3

也许这就是你想要的:

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

即:查找"数字( [0-9]) 后面不跟分号( [^;]) 的双引号( ),并用两个单引号代替。

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

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

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

于 2011-05-12T15:05:21.553 回答
2

对于“L”试试这个:

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

对于英寸,您可以尝试:

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

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

于 2011-05-12T15:26:05.117 回答