【问题标题】:How can I cut a string in bash ignoring escaped delimiters?如何在忽略转义分隔符的 bash 中剪切字符串?
【发布时间】:2015-11-10 00:47:55
【问题描述】:

我正在使用逗号作为分隔符从 csv 文件中剪切字符串。有没有办法给定界符添加一个选项来忽略某些包含定界符的字符串?

我想忽略所有写在引号内的逗号。

例子:

    asdf,1337,"asdf, asdf"

应该变成

    asdf
    1337
    asdf, asdf

不是

    asdf
    1337
    "asdf,
     asdf"

【问题讨论】:

  • 使用具有适当 CSV 解析器的语言。 CSV 解析起来非常棘手,而且这个轮子早就发明了。

标签: regex bash csv delimiter cut


【解决方案1】:

这个 awk 代码应该会有所帮助:

awk '{$0=$0","; while($0) { match($0,/ *"[^"]*" *,|[^,]*,/); 
             field=substr($0,RSTART,RLENGTH);
             gsub(/^ *"?|"? *,$/,"",field); 
             print field; $0=substr($0,RLENGTH+1)  }}' file 

用你的例子:

kent$ echo 'asdf,1337,"asdf, asdf"'|awk '{$0=$0",";
while($0) {
  match($0,/ *"[^"]*" *,|[^,]*,/)
  field=substr($0,RSTART,RLENGTH)
  gsub(/^ *"?|"? *,$/,"",field) 
  print field
  $0=substr($0,RLENGTH+1)  
}}'
asdf
1337
asdf, asdf

【讨论】:

  • awk -vRS='"' -vORS="" '(NR%2){gsub(/,/,"\n")}1'
猜你喜欢
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 2010-10-23
相关资源
最近更新 更多