我在CentOS 5.5上使用bash。我有一个用空格分隔的字符串,字符串只包含字母和数字,这个字符串可能有额外的空格,例如,"words"
和"string"
之间有多个空格:
$exmple= "This is a lovey 7 words string"
我想删除长度小于2的单词,在此示例中,需要删除单词"a"
和"7"
。并删除所有额外的空格,一个单词与另一个单词之间只有一个空格。
所以字符串变为:
"This is lovey words string"
答案 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
打印最后一个字符串。