linux - sed - 删除一对双引号之间的所有分号
问题描述
我有一个脏的 csv 文件,其中包含带引号的分号的行。我正在尝试使用以下命令清除这些分号:
sed -rin 's/(^.*\;.*\;\".*)(\;)(.*\"\;.*$)/\1\3/' file
但不知何故,这并没有删除所有的分号。一些有问题的行如下所示:
;0;"One ▒;)";123; ... ; nth-1column;
;0;"Two ▒;)";456; ... ; nthcolumn;
何时应该清洁它们:
;0;"One ▒)";123; ... ; nth-1column;
;0;"Two ▒)";456; ... ; nthcolumn;
可能存在一些编码问题,但这应该被正则表达式忽略。我只对删除分号感兴趣,然后处理编码。
关于如何积极清除双引号中包含的所有分号的任何想法?
解决方案
这可能对您有用(GNU sed):
sed -E ':a;s/^([^"]*("[^;"]*"[^"]*)*"[^";]*);/\1/;ta' file
从包含不在双引号之间的字符和不包含;
' 后跟双引号的引号字符串和既不是双引号也不是分号的字符的每行的前面开始进行反向引用。如果下一个字符是分号,则删除它并重复直到失败,然后打印结果。
替代:
sed -E '/^([^"]*("[^";]*"[^"]*)*"[^";]*);/{s//\n\1/;D}' file
或者:
sed -E 's/^([^"]*("[^";]*"[^"]*)*"[^";]*);/\n\1/;T;D' file
编辑:
sed -nE '/^([^"]*("[^";]*"[^"]*)*"[^";]*);/{:a;s//\1/;ta;p}' file
推荐阅读
- perl - 如何在没有子例程的情况下将应用程序配置加载到模块中
- angular - Bootstrap 模态关闭事件不会触发模态覆盖的关闭
- python - 如何仅将换行符添加到字典值?
- excel - 从 Excel 文件中过滤掉大约 2000 个电子邮件地址
- java - 将 Base64 编码的字节 [] 作为 JSON MIME 类型传递
- oracle - “sqlplus”:使用 docker exec 运行命令时在 $PATH 中找不到可执行文件
- angular - AngularFire 订阅在我的组件中只触发一次,但在我的 html 模板中工作正常
- spring - Reactive Spring Cloud Stream 从队列中读取所有数据,而非reactive 则一一读取消息
- python - NumPy - 涉及范围迭代器的向量化循环
- html - amp-html 中的代码如何响应多列图像?