如何删除bash中的额外空格?

Cha*_*lie 22 bash

如何删除变量中的额外空格HEAD

HEAD="    how to  remove    extra        spaces                     "
Run Code Online (Sandbox Code Playgroud)

结果:

how to remove extra spaces
Run Code Online (Sandbox Code Playgroud)

jma*_*man 25

试试这个:

echo "$HEAD" | tr -s " "
Run Code Online (Sandbox Code Playgroud)

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

NEWHEAD=$(echo "$HEAD" | tr -s " ")
Run Code Online (Sandbox Code Playgroud)

更新

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

NEWHEAD=$(echo "$HEAD" | tr -s " ")
NEWHEAD=${NEWHEAD%% }
NEWHEAD=${NEWHEAD## }
Run Code Online (Sandbox Code Playgroud)


Gur*_*uru 24

使用awk:

$ echo "$HEAD" | awk '$1=$1'
how to remove extra spaces
Run Code Online (Sandbox Code Playgroud)


gle*_*man 12

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

$ HEAD="    how to  remove    extra        spaces                     "
$ set -- $HEAD
$ HEAD=$*
$ echo ">>>$HEAD<<<"
>>>how to remove extra spaces<<<
Run Code Online (Sandbox Code Playgroud)

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

ary=($HEAD)
HEAD=${ary[@]}
echo "$HEAD"
Run Code Online (Sandbox Code Playgroud)

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

$ set -f
$ set -- $HEAD
$ set +f
Run Code Online (Sandbox Code Playgroud)


koj*_*iro 9

这匹马还没死!让我们继续打它!*

读入数组

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

set -f
read HEAD <<< $HEAD
set +f
Run Code Online (Sandbox Code Playgroud)

或者你可以做到

read -a HEAD <<< "$HEAD"
HEAD="${HEAD[*]}"
Run Code Online (Sandbox Code Playgroud)

扩展的参数扩展全局

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

*没有马实际受到伤害 - 这只是一个隐喻,可以为一个简单的问题获得六个+不同的答案.

  • 为了纪念这个答案(避免回声,shell扩展以及所有其他答案都进入其中),我删除了自己的错误答案. (2认同)

ndb*_*ent 5

这是我用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)
Run Code Online (Sandbox Code Playgroud)

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