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

如何在Zsh脚本中移除字符串中的不可见特殊字符及**符号

如何在Zsh脚本中移除字符串中的不可见特殊字符及**符号

看起来你这是从softwareupdate -l里拿的字符串混进了特殊字符——既有可见的**,还有不可见的非标准空格,导致两个看起来一样的"macOS Ventura"匹配失败了对吧?我给你几个实用的解决办法,都是在Zsh里直接能用的:

方法一:提取时直接清理所有非打印字符和**

既然checkupdate是从softwareupdate -l里提取的,那咱们可以在提取的同时就把脏东西清掉,一步到位:

# 假设你用grep提取目标字符串,后面直接接清理命令
checkupdate=$(softwareupdate -l | grep -o "macOS Ventura" | tr -dc '[:print:]' | sed 's/\*\*//g')

简单解释下:

  • tr -dc '[:print:]':删掉所有不可见的非打印字符(那些你在od输出里看到的奇怪空格就属于这类)
  • sed 's/\*\*//g':把字符串里所有的**直接替换成空,彻底删掉

方法二:标准化空格+清理特殊符号

你也能看到,两个字符串里的空格类型都不一样(一个是特殊空格,一个是普通空格),也可以先把所有空格统一成普通空格,再清理**,这样字符串格式更规整:

# 先把所有类型的空格转成普通空格,再删**,最后合并多余空格+去首尾空格
checkupdate=$(echo "$checkupdate" | tr '[:space:]' ' ' | sed 's/\*\*//g' | sed 's/  */ /g' | xargs)

这里的xargs会自动去掉字符串首尾的空格,sed 's/ */ /g'会把多个连续空格合并成一个,确保格式和你手动写的macos变量完全一致。

改完后的完整测试脚本

把清理逻辑整合到你的原脚本里,大概是这样:

#!/bin/zsh

# 提取并清理目标字符串
checkupdate=$(softwareupdate -l | grep -o "macOS Ventura" | tr -dc '[:print:]' | sed 's/\*\*//g')
macos='macOS Ventura'

echo -n "$checkupdate" | wc -m
echo -n "$macos" | wc -m

echo "$checkupdate" | tr -dc '[:print:]' | od -c
echo "***************"
echo "$macos" | tr -dc '[:print:]' | od -c

if [[ $checkupdate == $macos ]]; then
    echo "ok"
else
    echo "bad"
    exit 1
fi

运行这个脚本,你会看到两个字符串的od -c输出完全一致,最后会输出ok,不会再返回bad了。

备注:内容来源于stack exchange,提问作者Thrawnium

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 07:55:32