如何用Bash检查TSV格式变量中的指定ID是否存在?
解决方法
以下几种方式都能准确检查目标ID是否存在于你的TSV变量中:
方法1:使用grep的精确匹配选项
原命令失效的核心原因是grep默认会匹配包含目标字符串的任意行,如果ID是某个更长字符串的子串就会误判;另外如果ID包含正则特殊字符(比如.)也会出问题。加上-x(整行匹配)和-F(固定字符串匹配)就能彻底解决:
ID="06ca5611" echo "$IDS" | grep -qxF "$ID" # 通过退出码判断结果:$?为0表示存在,1表示不存在 if [ $? -eq 0 ]; then echo "ID存在" else echo "ID不存在" fi
方法2:利用Bash字符串匹配
直接通过Bash原生字符串匹配功能,借助换行符作为分隔符,覆盖ID在变量开头、中间、结尾的所有情况:
ID="06ca5611" if [[ "$IDS" =~ ^$ID$ ]] || [[ "$IDS" =~ $'\n'$ID$'\n' ]] || [[ "$IDS" =~ $'\n'$ID$ ]]; then echo "ID存在" else echo "ID不存在" fi
方法3:转为数组遍历检查
先把TSV变量按换行分割为数组,再逐个比对,适合需要后续对ID做更多操作的场景:
ID="06ca5611" # 将IDS按换行符分割为数组 IFS=$'\n' read -r -d '' -a id_array <<< "$IDS" # 遍历数组检查 found=0 for current_id in "${id_array[@]}"; do if [[ "$current_id" == "$ID" ]]; then found=1 break fi done if [ $found -eq 1 ]; then echo "ID存在" else echo "ID不存在" fi
额外注意事项
- 确保你的
ID变量没有多余空格或换行符,可通过ID=$(echo "$ID" | xargs)清理前后空白。 - 如果你的TSV真的包含制表符(而非示例中的每行一个ID),只需将分隔符换成
$'\t'即可适配上述方法。
内容的提问来源于stack exchange,提问作者GreenJenks
相关产品推荐
相关产品推荐

