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

