在bash中删除长度小于2的单词

时间:2010-12-11 16:30:05

标签: linux bash command-line

我在CentOS 5.5上使用bash。我有一个用空格分隔的字符串,字符串只包含字母和数字,这个字符串可能有额外的空格,例如,"words""string"之间有多个空格:

$exmple= "This is a lovey 7 words   string"

我想删除长度小于2的单词,在此示例中,需要删除单词"a""7"。并删除所有额外的空格,一个单词与另一个单词之间只有一个空格。

所以字符串变为:

"This is lovey words string"

4 个答案:

答案 0 :(得分:4)

修改(基于ennuikiller的sed回答)

使用纯Bash:

newstring=${exmple// ? / }   # remove one character words

规范化空白:

read newstring <<< $newstring

shopt -s extglob
newstring=${newstring//+( )/ }

<强>原始

exmple="This is a lovey 7 words   string"
for word in $exmple
do
    if (( ${#word} >= 2 ))
    then
        newstring+=$sp$word
        sp=' '
    fi
done

答案 1 :(得分:4)

sed做得很好:

example="This is a lovey 7 words string"
echo $example | sed -e 's/ [a-zA-Z0-9]\{1\} / /g'

答案 2 :(得分:0)

sed -e 's/ [a-zA-Z0-9] / /g'不会删除两个或更多空格。

这将:

echo "This is a lovey 7 words   string" | sed 's/ [a-zA-Z0-9 ] / /g'

这将从开头或结尾删除任何空格:

echo "   This is a lovey 7 words   string  " | sed 's/ [a-zA-Z0-9 ] / /g' | sed 's/^ *\| *$//g'

答案 3 :(得分:0)

awk也可以成功:

$ awk '{for (i=1; i<=NF; i++) s=(length($i)>2? s($i)FS : s); print s}' <<< "This is a lovey 7 words   string"
This lovey words string 

解释

这个想法是遍历字符串的所有字段,存储大于给定大小的字段。最后,打印存储的字符串。

  • for (i=1; i<=NF; i++)遍历所有字段。
  • s=(length($i)>2? s($i)FS : s)如果单词的长度大于2,则将其附加到当前句子。否则,不是。
  • print s打印最后一个字符串。