【问题标题】:replace consecutive spaces with one comma using command line使用命令行用一个逗号替换连续的空格
【发布时间】:2015-11-15 02:12:56
【问题描述】:

想知道用一个逗号替换一个或多个连续空格的最有效解决方案吗?单个命令是首选。 :)

我使用的是 Mac OS/Linux。

提前致谢, 林

【问题讨论】:

    标签: linux string awk


    【解决方案1】:

    这是tr 提供的开箱即用的功能

    tr -s ' ' ','
    

    【讨论】:

      【解决方案2】:

      注意关于此示例的前导/尾随空格的评论(并建议 OP 可能不想转换 那些):

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

      大多数人会认为 TAB 是一个“空格”,因此可以使用更全面(但复杂)的方法:

      sed \
          -e ':loop' \
          -e 's/\([^[:space:]]\)[[:space:]][[:space:]]*\([^[:space:]]\)/\1,\2/g' \
          -e 't loop' file
      

      需要循环来处理\1\2 重叠的情况。

      这是一个示例输入:

      total 36
      drwx------ 5 root root  4096 Aug 21 03:58 0994576031
      drwx------ 4 tom  users 4096 Aug 21 04:27 fake-tom
      -rw-r--r-- 1 tom  users    0 Aug 21 04:53 foo
      -rw-r--r-- 1 tom  users  155 Aug 21 04:27 gpgagent.log
      drwx------ 2 tom  users 4096 Aug 21 04:27 gpg-MOxBtc
      drwx------ 2 root root  4096 Aug 21 03:58 kde-root
      drwx------ 2 tom  users 4096 Aug 21 04:27 ssh-cdcgKy3228
      drwxrwxrwt 2 root root  4096 Aug 21 03:57 VMwareDnD
      drwxr-xr-x 2 root root  4096 Aug 21 03:58 vmware-root
      drwx------ 2 root root  4096 Aug 21 03:58 vmware-root-2999462734
      

      和输出

      total,36
      drwx------,5,root,root,4096,Aug,21,03:58,0994576031
      drwx------,4,tom,users,4096,Aug,21,04:27,fake-tom
      -rw-r--r--,1,tom,users,0,Aug,21,04:53,foo
      -rw-r--r--,1,tom,users,155,Aug,21,04:27,gpgagent.log
      drwx------,2,tom,users,4096,Aug,21,04:27,gpg-MOxBtc
      drwx------,2,root,root,4096,Aug,21,03:58,kde-root
      drwx------,2,tom,users,4096,Aug,21,04:27,ssh-cdcgKy3228
      drwxrwxrwt,2,root,root,4096,Aug,21,03:57,VMwareDnD
      drwxr-xr-x,2,root,root,4096,Aug,21,03:58,vmware-root
      drwx------,2,root,root,4096,Aug,21,03:58,vmware-root-2999462734
      

      【讨论】:

        【解决方案3】:

        使用 sed:

        sed 's/  */,/g'
        

        举个例子:

        $ echo 'a b  c   d' | sed 's/  */,/g'
        a,b,c,d
        

        【讨论】:

          【解决方案4】:

          试试这个单行,这不会替换 BOL 或 EOL 处的空格

          awk -v OFS="," '{$1=$1}7' file
          

          这一行将替换所有空格:

          awk '1+gsub(/ +/,",")' file
          

          另一个sed,这将替换所有空格,包括开头和结尾的空格

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

          【讨论】:

            猜你喜欢
            • 2014-05-31
            • 1970-01-01
            • 2023-01-30
            • 1970-01-01
            • 2015-01-13
            • 2011-04-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多