![删除以逗号分隔的特定字段中的所有空格](https://linux22.com/image/140211/%E5%88%A0%E9%99%A4%E4%BB%A5%E9%80%97%E5%8F%B7%E5%88%86%E9%9A%94%E7%9A%84%E7%89%B9%E5%AE%9A%E5%AD%97%E6%AE%B5%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%A9%BA%E6%A0%BC.png)
输入:
11 22 33 44,1 2,2
输出
11223344,1 2,2
我希望删除字段 number 中的所有空格1
,该字段位于第一个字段之前comma
。
答案1
使用sed
,您要么需要一个循环:
sed -e :1 -e 's/^\([^,]*\) /\1/;t1'
或者使用保留空间,以便能够替换所有空格,然后从那里恢复该行的原始部分:
sed 'h;s/,.*//;s/ //g;G;s/\n[^,]*//'
使用以下命令会更容易awk
:
awk -F, -v OFS=, '{gsub(" ", "", $1); print}'
或者perl
:
perl -F, -lpe '$F[0] =~ s/ //g; $_ = join ",", @F'
或者:
perl -pe 's{[^,]*}{$& =~ s/ //gr}e'
或者:
perl -pe 's/\G[^, ]*\K //g'
最后一个也许值得解释:\G
与旗帜相伴g
。
标志g
意味着g
全局替换,并意味着一个循环,perl
在前一个出现之后继续搜索下一个出现。
\G
匹配在上一个匹配之后的那个位置,因此在最后一个替换的空格之后,以及在循环的第一遍中,在行的开头。当我们使用时,[^,]
我们不允许循环超过第一个逗号,因此仅替换它之前的所有空格。