【问题标题】:Removing spaces after and before commas (not between words) using command line使用命令行删除逗号前后的空格(不是单词之间)
【发布时间】:2014-03-01 19:06:44
【问题描述】:

我有一个使用 pull_data $a $b > $id.csv 创建的 CSV 文件。

例如输出中的一行是:

1041894,30/01/2013,31/01/2013,A Customer Limited , 2, 1,PR14, PR14 , 104 An Item ,247 An Item

这是我的情况:

  • 我需要删除逗号前后的所有空格,但排除单词之间的空格。

  • 我需要每行如下所示,并希望尽可能使用 sed:

1041894,30/01/2013,31/01/2013,A Customer Limited,2,1,PR14,PR14,104 An Item,247 An Item

我试过sed 's/, \+\| \+,/,/g',但这不会删除逗号前后的所有空格,它只会删除一些。

【问题讨论】:

标签: regex csv sed


【解决方案1】:

试试这个 sed:

sed -i.bak -e 's/,[[:space:]]\+/,/g' -e 's/[[:space:]]\+,/,/g' file

或者这个 awk:

awk -F '[[:space:]]*,[[:space:]]*' '{$1=$1}1' OFS=, file

更新:

OP 可能有 空格 而不仅仅是空格:

也试试这个 sed:

sed -i.bak 's/[[:space:]]*,[[:space:]]*/,/g' file

【讨论】:

  • 您的新正则表达式看起来与我发布的非常相似;)
  • 就像你对 this answer 所做的那样,基于我在 sed、@Jotne 上的做法?
  • @Jotne:在尝试了各种测试后,我发布了 3 个替代方案。一两个可能看起来相似,因为方法相似。
  • @anubhava 我试过sed -i.bak 's/ *, */,/g' file 但它没有删除文件中的任何空格?我还有, 1等。
  • 应该有效。您是否尝试过我发布的其他 2 个替代方案?
【解决方案2】:

这可能对你有用(GNU sed):

sed 's/\s*,\s*/,/g' file

【讨论】:

    【解决方案3】:

    使用 awk

    awk 'BEGIN{FS=OFS=","} {for (i=1;i<=NF;i++) gsub(/^[ \t]+|[ \t]+$/, "", $i)}1' file
    

    【讨论】:

      【解决方案4】:

      有些是这样的:

      awk '{gsub(/[[:space:]]*,[[:space:]]*/,",")}1' file
      

      echo "1041894,30/01/2013,31/01/2013,A Customer Limited , 2, 1,PR14 ,PR14 ,104 An Item ,247 An Item" | awk '{gsub(/[[:space:]]*,[[:space:]]*/,",")}1'
      1041894,30/01/2013,31/01/2013,A Customer Limited,2,1,PR14,PR14,104 An Item,247 An Item
      

      它确实删除了,之前或之后的所有空格

      编辑:添加[[:space:]] 以删除所有类型的空格。

      【讨论】:

      • 我认为你需要在 gsub() 中运行函数
      • @BMW 复制和粘贴错误,示例确实有正确的() 谢谢。
      猜你喜欢
      • 1970-01-01
      • 2021-08-22
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多