Shell脚本匹配指定变量后如何终止匹配仅返回对应值?
Shell脚本匹配文本单行值问题解决
问题场景
文本文件exemple.txt格式如下:
var1 = X var2 = X var3 = X var4 = BDH
现有Shell脚本片段:
values=$(grep -hnr -A2 "$another_value_to_match" exemple.txt | cut -d "=" -f2) find_all_values=$(ls -d $DIR["$values"]* | xargs -n 1 basename)
其中another_value_to_match为从其他函数获取的变量,取值为var1/var2/var3/var4;find_all_values用于查找指定目录下以对应值(如X、BDH)开头的子目录。
问题:当匹配var4(文件最后一行)时脚本正常,但匹配var1/var2/var3时,values会返回X X X BDH这类多余值——原因是-A2参数会抓取匹配行之后的2行内容,导致多取了无关行的值。
解决方案
要实现匹配目标行后立即停止,仅返回对应值,修改values的获取命令即可:
修改后的取值命令
values=$(grep -m1 -oP "^\\s*$another_value_to_match\\s*=\\s*\\K.*" exemple.txt)
参数说明:
-m1:找到第一个匹配项后立即停止,确保只获取目标行的值-oP:启用Perl兼容正则表达式,仅输出匹配的核心内容- 正则表达式
^\s*$another_value_to_match\s*=\s*\K.*:^\s*匹配行首的空白字符$another_value_to_match精准匹配目标变量名\s*=\s*匹配等号及前后的空白\K忽略前面匹配的冗余内容,只保留等号后的目标值.*匹配等号后的所有内容(支持X、BDH这类不同长度的值)
验证效果
- 当
another_value_to_match=var2时,echo $values输出X - 当
another_value_to_match=var4时,echo $values输出BDH
优化目录查找命令
原ls命令存在变量引用和特殊字符处理风险,建议改用find更可靠:
find_all_values=$(find "$DIR" -maxdepth 1 -type d -name "$values*" -exec basename {} \;)
-maxdepth 1限制只查找当前目录下的子目录-type d确保只匹配目录类型-exec basename {} \;直接获取目录名,无需依赖xargs处理
内容的提问来源于stack exchange,提问作者Nabil Zouita
相关产品推荐
相关产品推荐

