【发布时间】:2015-11-15 02:12:56
【问题描述】:
想知道用一个逗号替换一个或多个连续空格的最有效解决方案吗?单个命令是首选。 :)
我使用的是 Mac OS/Linux。
提前致谢, 林
【问题讨论】:
想知道用一个逗号替换一个或多个连续空格的最有效解决方案吗?单个命令是首选。 :)
我使用的是 Mac OS/Linux。
提前致谢, 林
【问题讨论】:
这是tr 提供的开箱即用的功能
tr -s ' ' ','
【讨论】:
注意关于此示例的前导/尾随空格的评论(并建议 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
【讨论】:
使用 sed:
sed 's/ */,/g'
举个例子:
$ echo 'a b c d' | sed 's/ */,/g'
a,b,c,d
【讨论】:
试试这个单行,这不会替换 BOL 或 EOL 处的空格
awk -v OFS="," '{$1=$1}7' file
这一行将替换所有空格:
awk '1+gsub(/ +/,",")' file
另一个sed,这将替换所有空格,包括开头和结尾的空格
sed 's/ \+/,/g' file
【讨论】: