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

如何用Bash解析文本中三重大括号{{{}}}包裹的字符串?

解决用sed提取{{{和}}}之间字符串的问题

看来你现在卡在了提取文本里{{{和}}}包裹内容的环节,之前的sed命令没达到预期效果对吧?我来帮你捋清楚问题并给出可行的解决方案。

首先先说说你现有命令的问题:

  • 第一个sed命令s/.*{{{ //里多了个空格,但你的原文本里是{{{VSER}}}({{{和内容之间没有空格),导致匹配规则找不到对应内容,替换完全没生效。
  • 第二个sed命令的语法错得离谱,sed的替换格式是s/匹配内容/替换内容/,你用#做分隔符的话得提前声明,而且写法也不对,这导致它根本没起到过滤}}}及后续内容的作用。

正确的解决方案(两种常用方式)

方式一:grep + sed + tr(最简洁直观)

这个组合能一次性提取所有{{{和}}}之间的内容,并以空格分隔输出:

echo "$TEXT" | grep -o '{{{[^}]*}}}' | sed 's/{{{\(.*\)}}}/\1/' | tr '\n' ' '

分步解释:

  • grep -o '{{{[^}]*}}}':只输出文本中所有匹配{{{开头、}}}结尾的片段,每个匹配项单独占一行
  • sed 's/{{{\(.*\)}}}/\1/':把每个匹配到的{{{内容}}}格式替换成纯内容
  • tr '\n' ' ':把所有换行符替换成空格,最终得到空格分隔的结果

方式二:纯sed实现(无需其他工具)

如果你只想用sed完成,可以通过多次全局替换来提取所有目标内容:

echo "$TEXT" | sed -n 's/.*{{{\([^}]*\)}}}/\1 /; s/.*{{{\([^}]*\)}}}/\1 /; s/.*{{{\([^}]*\)}}}/\1 /; p' | sed 's/^.* //; s/ $//'

这个命令通过三次替换分别提取三个目标内容,最后清理掉多余的前缀和末尾空格。

测试验证

假设你的TEXT变量内容是:

{{{VSER}}} is doing well. He went to {{{MARKET}}}. It is very useful {{{RESOURCE}}}。

执行上面任意一种命令后,就能得到你想要的结果:VSER MARKET RESOURCE

内容的提问来源于stack exchange,提问作者Abdennour TOUMI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:41:14