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

时间:2012-10-26 18:23:59

标签: bash

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

HEAD="    how to  remove    extra        spaces                     "

结果:

how to remove extra spaces

10 个答案:

答案 0 :(得分:24)

试试这个:

echo "$HEAD" | tr -s " "

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

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

<强>更新

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

NEWHEAD=$(echo "$HEAD" | tr -s " ")
NEWHEAD=${NEWHEAD%% }
NEWHEAD=${NEWHEAD## }

答案 1 :(得分:24)

使用awk:

$ echo "$HEAD" | awk '$1=$1'
how to remove extra spaces

答案 2 :(得分:12)

利用不引用变量

的分词效果
$ HEAD="    how to  remove    extra        spaces                     "
$ set -- $HEAD
$ HEAD=$*
$ echo ">>>$HEAD<<<"
>>>how to remove extra spaces<<<

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

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

不引用的一个危险的副作用是filename expansion将起作用。所以先将其关闭,然后在以下情况下重新启用它:

$ set -f
$ set -- $HEAD
$ set +f

答案 3 :(得分:9)

这匹马尚未死亡:让我们继续打它!*

读入数组

Other people已提到var getMenuItem = function () { //now here MENU will refer to the MENU variable in the shared scope } ,但由于使用不带引号的扩展可能会导致不受欢迎的扩展,因此使用它的所有答案都可以被视为或多或少相同。 You could do

read

或者你可以做到

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

带参数扩展的扩展全局

read -a HEAD <<< "$HEAD"
HEAD="${HEAD[*]}"

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

答案 4 :(得分: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)

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

答案 5 :(得分: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')

答案 6 :(得分:1)

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

column -t将:

  1. 删除行开头和结尾处的空格
  2. 将标签转换为空格
  3. 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$

答案 7 :(得分:0)

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

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

输出:how to remove extra spaces

答案 8 :(得分:0)

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

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

# [...]$ This is some text

答案 9 :(得分:0)

空白可以采用 空格 标签 的形式。尽管$ cc tree.c $ ./a.out 6 |-2 |-1 |-8 |-4 |-9 $ 和其他工具虽然是非印刷字符且对我们来说是看不见的,但它们将它们视为不同形式的空格,并且只能根据您的要求进行操作。即,如果您告诉sed删除x个 空格 ,它将执行此操作,但是表达式将不匹配 tabs < / em> 。反之亦然-为sed提供一个 tab ,它甚至不匹配 空格 如果它们的数量等于 选项卡 中的数量。

一种更具扩展性的解决方案,可用于删除 空格 选项卡 (我已经测试过在您的标本变量中混合两者)是:

sed

或者我们可以收紧@Frontear的使用echo $HEAD | sed 's/^[[:blank:]]*//g' 而不 xargs的出色建议:

tr

但是,请注意echo $HEAD | xargs 也会删除换行符。因此,如果要xargs一个文件并将其通过管道传输到cat,则所有多余的空间(包括换行符)都将被删除,所有内容都放在同一行;-)。

以上两项在我的测试中均达到了您想要的结果。