You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Bash脚本优雅地移除句子中长度超过指定字符数的单词?

更简洁的方案:无需转换空格与换行符

嘿,你说得没错——当前的方法虽然可行,但来回转换换行和空格确实有点繁琐。这里有几种更优雅的解决方案,直接在一行内处理所有单词,不用折腾格式转换:

方案1:用awk直接遍历字段(推荐)

awk默认会把输入按空格分割成多个字段(NF表示总字段数),我们可以直接遍历每个字段,筛选出长度≤8的单词并输出:

echo "$var" | awk '{
    for(i=1; i<=NF; i++) {
        if(length($i) <= 8) {
            printf "%s ", $i
        }
    }
    print ""
}' | sed 's/ $//'

或者更紧凑的单行版本,同时处理末尾多余的空格:

echo "$var" | awk '{s=""; for(i=1;i<=NF;i++) if(length($i)<=8) s=s $i " "; sub(/ $/,"",s); print s}'

解释:

  • NF:awk内置变量,代表当前行的字段总数(也就是单词数量)
  • length($i):获取第i个字段的长度
  • sub(/ $/,"",s):去掉结果字符串末尾的空格

方案2:用sed正则替换

sed可以直接匹配并删除长度超过8的单词,然后清理多余空格:

echo "$var" | sed -E 's/\b[[:alnum:]-]{9,}\b//g; s/ +/ /g; s/^ //; s/ $//'

解释:

  • \b[[:alnum:]-]{9,}\b:匹配由字母、数字或横杠组成的、长度≥9的单词(\b是单词边界)
  • s/ +/ /g:把多个连续空格替换成单个空格
  • s/^ //; s/ $//:分别去掉开头和结尾的空格

方案3:纯Bash内置实现(无需外部工具)

如果不想调用awk/sed这类外部工具,用Bash本身的循环和参数扩展就能搞定:

cleaned_var=""
for word in $var; do
    if [ ${#word} -le 8 ]; then
        cleaned_var="$cleaned_var $word"
    fi
done
echo "${cleaned_var# }"  # 去掉开头的多余空格

解释:

  • ${#word}:Bash内置语法,获取变量word的长度
  • ${cleaned_var# }:参数扩展,删除变量开头的第一个空格

这些方案都不需要来回转换空格和换行符,代码更简洁,逻辑也更直观~

内容的提问来源于stack exchange,提问作者dzafer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 11:42:46