如何用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
相关产品推荐
相关产品推荐

