如何使用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
相关产品推荐
相关产品推荐

