33

如何删除变量中的多余空格HEAD

HEAD="    how to  remove    extra        spaces                     "

结果:

how to remove extra spaces
4

10 回答 10

37

尝试这个:

echo "$HEAD" | tr -s " "

或者您可能想将其保存在变量中:

NEWHEAD=$(echo "$HEAD" | tr -s " ")

更新

要删除前导和尾随空格,请执行以下操作:

NEWHEAD=$(echo "$HEAD" | tr -s " ")
NEWHEAD=${NEWHEAD%% }
NEWHEAD=${NEWHEAD## }
于 2012-10-26T18:25:37.177 回答
29

使用 awk:

$ echo "$HEAD" | awk '$1=$1'
how to remove extra spaces
于 2012-11-27T11:49:08.857 回答
13

利用不引用变量的分词效果

$ HEAD="    how to  remove    extra        spaces                     "
$ set -- $HEAD
$ HEAD=$*
$ echo ">>>$HEAD<<<"
>>>how to remove extra spaces<<<

如果您不想使用位置参数,请使用数组

ary=($HEAD)
HEAD=${ary[@]}
echo "$HEAD"

不引用的一个危险副作用是文件名扩展将起作用。所以先关闭它,然后重新启用它:

$ set -f
$ set -- $HEAD
$ set +f
于 2012-10-26T20:22:15.207 回答
9

这匹马还没有完全死去:让我们继续打败它!*

读入数组

其他人已经提到过read,但是由于使用不带引号的扩展可能会导致不需要的扩展,因此使用它的所有答案都可以被视为或多或少相同。你可以做

set -f
read HEAD <<< $HEAD
set +f

或者你可以做

read -rd '' -a HEAD <<< "$HEAD"  # Assuming the default IFS
HEAD="${HEAD[*]}"

带有参数扩展的扩展通配符

$ shopt -s extglob
$ HEAD="${HEAD//+( )/ }" HEAD="${HEAD# }" HEAD="${HEAD% }"
$ printf '"%s"\n' "$HEAD"
"how to remove extra spaces"

*实际上没有马受到伤害——这只是一个简单问题得到六个以上不同答案的隐喻。

于 2015-05-06T03:30:29.167 回答
6

以下是我将如何使用 sed:

string='    how to  remove    extra        spaces                     '
echo "$string" | sed -e 's/  */ /g' -e 's/^ *\(.*\) *$/\1/'

=> how to remove extra spaces   # (no spaces at beginning or end)

第一个 sed 表达式用一个空格替换任何超过 1 个空格的组,第二个表达式删除任何尾随或前导空格。

于 2012-10-26T19:50:21.810 回答
2

echo -e " abc \t def "|column -t|tr -s " "

column -t将要:

  1. 删除行首和行尾的空格
  2. 将制表符转换为空格

tr -s " "将多个空间压缩到单个空间


顺便说一句,要查看您可以使用的整个输出cat - -A:显示所有空格字符,包括制表符和 EOL:

echo -e " abc \t def "|cat - -A

输出:abc ^I def $

echo -e " abc \t def "|column -t|tr -s " "|cat - -A

输出: abc def$

于 2016-06-13T17:59:50.307 回答
2

空白可以采用空格制表符的形式。尽管它们是非打印字符并且我们看不到,但sed其他工具将它们视为不同形式的空白,并且仅根据您的要求进行操作。即,如果您告诉sed删除 x 个空格,它将执行此操作,但表达式将不匹配tabs。反之亦然 - 提供一个制表符sed它不会匹配空格,即使它们的数量等于制表符中的那些。

一个更具可扩展性的解决方案可以删除空格制表符形式的额外空间(我已经在您的样本变量中测试了两者的混合)是:

echo $HEAD | sed 's/^[[:blank:]]*//g'

或者我们可以收紧@Frontear 的xargs 使用的极好建议tr

echo $HEAD | xargs

但是,请注意,xargs这也会删除换行符。因此,如果您要cat创建一个文件并将其通过管道传输到xargs,则所有额外的空格(包括换行符)都将被删除,并且所有内容都放在同一行;-)。

在我的测试中,上述两项都达到了您想要的结果。

于 2020-06-06T14:05:45.443 回答
1

试试这个:

echo '    how to  remove    extra        spaces                     ' | sed 's/^ *//g' | sed 's/$ *//g' | sed 's/   */ /g'

或者

HEAD="    how to  remove    extra        spaces                     "
HEAD=$(echo "$HEAD" | sed 's/^ *//g' | sed 's/$ *//g' | sed 's/   */ /g')
于 2012-10-26T19:44:35.470 回答
1

不带引号的 echo 变量可以满足您的要求:

HEAD="    how to  remove    extra        spaces      "
echo $HEAD

# or assign to new variable
NEW_HEAD=$(echo $HEAD)
echo $NEW_HEAD

输出:how to remove extra spaces

于 2018-09-25T15:41:11.643 回答
1

我会使用tr来删除多余的空格,并使用xargs来修剪前后。

TEXT="     This          is  some                             text   "
echo $(echo $TEXT | tr -s " " | xargs)

# [...]$ This is some text
于 2019-06-09T23:15:50.733 回答