在ksh/shell中搜索指定字符串并提取其后括号内内容
在ksh或者bash这类shell环境下,要从给定的示例字符串里提取Masking View Names后面大括号内的内容,我整理了几个实用的解决方案,你可以根据自己的环境和需求选择:
方案1:grep + sed组合
这个组合兼容性强,适用于大多数shell环境:
# 定义输入字符串 input_str="Masking View Names { hostname1 hostname2 } Parent Initiator Groups { None }" # 提取目标内容 echo "$input_str" | grep -o "Masking View Names {[^}]*}" | sed 's/Masking View Names {\(.*\)}/\1/'
原理说明:
grep -o只输出匹配到的片段,这里精准匹配Masking View Names {开始到第一个}结束的整段内容sed通过正则分组捕获括号内的内容,用反向引用\1提取出我们需要的部分
方案2:GNU awk直接匹配
如果你的环境支持GNU awk(gawk),这个写法更简洁直观:
input_str="Masking View Names { hostname1 hostname2 } Parent Initiator Groups { None }" echo "$input_str" | awk 'match($0, /Masking View Names \{([^}]*)\}/, match_arr) {print match_arr[1]}'
原理说明:
match()函数按照正则表达式匹配字符串,把括号内捕获的内容存入match_arr数组- 直接打印
match_arr[1]就能得到我们需要的括号内的内容
方案3:纯Shell参数扩展(无外部工具)
如果不想依赖任何外部命令,纯ksh/bash的参数扩展就能完成:
input_str="Masking View Names { hostname1 hostname2 } Parent Initiator Groups { None }" # 第一步:截掉"Masking View Names "之前的所有内容 temp_content=${input_str#*Masking View Names } # 第二步:截掉第一个"}"及之后的内容 temp_content=${temp_content%%}*} # 第三步:去掉开头的"{" final_result=${temp_content#\{} echo "$final_result"
原理说明:
${var#*pattern}:从字符串开头删除到第一个pattern的全部内容${var%%}*}:从字符串结尾删除第一个}及之后的全部内容${var#\{}:删除开头的{字符(转义是因为{`在shell里有特殊含义)
这些方案都能完美处理示例中的场景,要是遇到括号内包含特殊字符的情况,只需要微调正则或者参数扩展的匹配规则就行。
内容的提问来源于stack exchange,提问作者William Balkcom
相关产品推荐
相关产品推荐

