我有一个csv文件,其字段由双引号(")和逗号(,)分隔,例如:
"123","4"5""6","789"但是,数据中可能有一些双引号("),即需要转换为单引号(')的4"5""6,即
我需要改变
"123","4"5""6","789"至
"123","4'5''6","789"我试过
sed "s/\(\",\"\)\(\"\|[^\(","\)]\)*\(\",\"\)/\1'\3/"g 但只限于(\"\|[^\(","\)]\)*
匹配"或不匹配","
但也许我需要的是
匹配"而不是","
另一种方法可以执行顺序sed,即
但无论是哪种方式,我都不知道该怎么做。
虽然我可以先将所有的"替换为',然后重新格式化csv,但它似乎很昂贵,即sed -i -e "s/\"/'/g" -e "s/','/\",\"/g" -e "s/^'/\"/g" -e "s/'$/\"/g" myFile.csv。
发布于 2017-03-24 05:23:46
先找到并匹配4"5""6“ 将结果传递到下一个语句并替换为4'5‘'6
这在perl中是可能的。
$ echo '"123","4"5""6","789"' | perl -pe 's/"\K[^,]+(?=")/$&=~s|"|\x27|gr/ge'
"123","4'5''6","789""\K[^,]+(?=")匹配列内容,省略外部双引号,并使用查找符。$&=~s|"|\x27|gr将列内容中的双引号替换为单引号e修饰符允许使用Perl代码而不是替换字符串。
使用sed时,涉及到杂乱的分支
$ echo '"123","4"5""6","789"' | sed -E ':a s/("[^,]+)"([^,]+")(,|$)/\1\x27\2\3/; ta'
"123","4'5''6","789":a标记标签("[^,]+)"([^,]+")(,|$)至少用一个内部双引号匹配列内容。\1\x27\2\3将内部双引号替换为单引号ta分支就可以标记ahttps://stackoverflow.com/questions/42991296
复制相似问题