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

Bash中如何提取特殊字符间内容?MongoDB语句提取求助

解决MongoDB插入命令的字符串提取问题

嘿,我来帮你搞定这个字符串提取的难题!你需要从db.COLLECTION_NAME.insert(document)这类命令里拆分出集合名和括号内的文档内容,之前的bash参数展开方法在遇到特殊字符或括号时会失效,下面给你两种靠谱的解决方案:

方法一:Bash参数展开(适合简单场景)

如果你的文档内容里不包含右括号),可以用bash的参数展开分步处理:

  1. 提取集合名

    cmd="db.COLLECTION_NAME.insert(document)"
    # 先去掉开头的"db."
    temp="${cmd#db.}"
    # 再去掉从".insert"开始的所有内容
    collection="${temp%.insert*}"
    echo $collection  # 输出: COLLECTION_NAME
    
  2. 提取文档内容

    # 去掉"insert("之前的所有内容
    temp="${cmd#*insert(}"
    # 去掉结尾的右括号")"
    document="${temp%)}"
    echo $document  # 输出: document
    

⚠️ 注意:这个方法只适用于文档内容里没有)的情况,如果文档是带嵌套括号的JSON(比如{name: "Bob", address: {city: "NY"}}),bash的%会匹配第一个结尾的),导致提取内容不完整。

方法二:Sed正则匹配(通用场景,支持特殊字符/嵌套括号)

用sed的贪婪正则匹配可以完美处理包含特殊字符、嵌套括号的复杂情况:

  1. 提取集合名

    cmd="db.orders.insert({user: 123, items: [{id: 45, qty: 2}]})"
    collection=$(echo "$cmd" | sed -E 's/^db\.([^.]+)\.insert\(.*\)$/\1/')
    echo $collection  # 输出: orders
    

    正则解释:^db\.匹配命令开头的db.,([^.]+)捕获db.之后到下一个.之间的集合名,最后用\1输出捕获的内容。

  2. 提取文档内容

    document=$(echo "$cmd" | sed -E 's/^db\.[^.]+\.insert\((.*)\)$/\1/')
    echo $document  # 输出: {user: 123, items: [{id: 45, qty: 2}]}
    

    正则解释:^db\.[^.]+\.insert\(匹配命令开头到insert(的部分,(.*)贪婪捕获括号内的所有内容(直到最后一个)),用\1输出捕获的完整文档内容。

这个方法不管文档里有多少嵌套括号或特殊字符,只要原始命令格式正确,都能准确提取。

内容的提问来源于stack exchange,提问作者Hat hout

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:07:51