我几乎遇到了以下问题但未找到解决方案。这可能是我的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
任何人都可以帮助我吗?
答案 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 -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,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
基本上将输入分为;
"
替换为单'
"
放回到开头和结尾答案 2 :(得分:2)
对于“L”,试试这个:
sed "s/\"L\"/'L'/g"
对于英寸,您可以尝试:
sed "s/\([0-9]\)\"\"/\1''\"/g"
我不确定这是最好的选择,但我已经尝试过并且有效。我希望这有用。