如何删除变量HEAD
中多余的空格?
HEAD=" how to remove extra spaces "
结果:
how to remove extra spaces
试试这个:
echo "$HEAD" | tr -s " "
或者,也许您想将其保存在变量中:
NEWHEAD=$(echo "$HEAD" | tr -s " ")
更新
要删除前导和尾随空格,请执行以下操作:
NEWHEAD=$(echo "$HEAD" | tr -s " ")
NEWHEAD=${NEWHEAD%% }
NEWHEAD=${NEWHEAD## }
使用 awk:
$ echo "$HEAD" | awk '$1=$1'
how to remove extra spaces
利用不引用变量的分词效果
$ 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
这匹马还没有完全死去:让我们继续打败它!
读入阵列
其他人已经提到过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"
*实际上没有马受到伤害——这只是一个比喻,为一个简单的问题获得六个+不同的答案。
以下是我使用 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 个空格的组替换为单个空格,第二个表达式删除任何尾随空格或前导空格。
echo -e " abc t def "|column -t|tr -s " "
column -t
将:
- 删除行首和行尾的空格
- 将制表符转换为空格
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$
空格可以采用空格和制表符的形式。尽管它们是非打印字符并且我们看不到,但sed
和其他工具将它们视为不同形式的空白,并且仅对您要求的内容进行操作。 即,如果您告诉sed
删除 X 个空格,它将执行此操作,但表达式将不匹配制表符。反之亦然 - 提供一个制表符来sed
,它不会匹配空格,即使它们的数量等于制表中的空格。
一个更可扩展的解决方案可以删除空格和制表符形式的任一/两个额外空间(我已经测试过在您的样本变量中混合两者)是:
echo $HEAD | sed 's/^[[:blank:]]*//g'
或者我们可以收紧@Frontear的极好建议,即在没有tr
的情况下使用xargs
:
echo $HEAD | xargs
但是,请注意,xargs
也会删除换行符。 因此,如果您要cat
一个文件并将其通过管道传输到xargs
,则删除所有多余的空间(包括换行符),并将所有内容放在同一行上;-)。
在我的测试中,上述两种方法都达到了您想要的结果。
试试这个:
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')
我会使用 tr 来删除多余的空格,并使用 xargs 来修剪背面和正面。
TEXT=" This is some text "
echo $(echo $TEXT | tr -s " " | xargs)
# [...]$ This is some text
不带引号的回显变量可以满足您的需求:
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