Bash中如何提取特殊字符间内容?MongoDB语句提取求助
解决MongoDB插入命令的字符串提取问题
嘿,我来帮你搞定这个字符串提取的难题!你需要从db.COLLECTION_NAME.insert(document)这类命令里拆分出集合名和括号内的文档内容,之前的bash参数展开方法在遇到特殊字符或括号时会失效,下面给你两种靠谱的解决方案:
方法一:Bash参数展开(适合简单场景)
如果你的文档内容里不包含右括号),可以用bash的参数展开分步处理:
提取集合名
cmd="db.COLLECTION_NAME.insert(document)" # 先去掉开头的"db." temp="${cmd#db.}" # 再去掉从".insert"开始的所有内容 collection="${temp%.insert*}" echo $collection # 输出: COLLECTION_NAME提取文档内容
# 去掉"insert("之前的所有内容 temp="${cmd#*insert(}" # 去掉结尾的右括号")" document="${temp%)}" echo $document # 输出: document
⚠️ 注意:这个方法只适用于文档内容里没有)的情况,如果文档是带嵌套括号的JSON(比如{name: "Bob", address: {city: "NY"}}),bash的%会匹配第一个结尾的),导致提取内容不完整。
方法二:Sed正则匹配(通用场景,支持特殊字符/嵌套括号)
用sed的贪婪正则匹配可以完美处理包含特殊字符、嵌套括号的复杂情况:
提取集合名
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输出捕获的内容。提取文档内容
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
相关产品推荐
相关产品推荐

