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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:10:56