如何删除BASH中{}括号外的所有内容?

时间:2014-08-12 01:19:05

标签: bash awk sed

我需要删除{}括号外的所有数据。例如,这里是$variable行:

The fish {{went}} to the {{restaurant}} to eat some {fish} for lunch.

在删除配对的{}之外的所有内容之后,输出只会是:

{{went}}{{restaurant}}{fish}
  • 所有大括号成对出现。

我找到了类似的帖子Delete all data outside square brackets,并处理方括号,但我尝试修改两个工作答案失败,因为[和{{1}代码中可以有多种含义,可以是原始数据中显示的符号,也可以是{sed或正则表达式使用的符号。这是我尝试的,基于另一篇文章中的答案。

awk

如何进行适当的修改,以便其中一个删除大括号外的所有数据?

5 个答案:

答案 0 :(得分:6)

这是使用grep的解决方案。 -P表示使用Perl语法,允许非贪婪的表达式,-o只打印匹配。

echo "The fish {{went}} to the {{restaurant}} to eat some {fish} for lunch." |
grep -Po '{?{[^{}]+}}?'

答案 1 :(得分:4)

$ echo "The fish {{went}} to the {{restaurant}} to eat some {fish} for lunch." |
sed -r 's/(^|\})[^{}]+(\{|$)/\1\2/g'
{{went}}{{restaurant}}{fish}

或使用GNU awk for FPAT:

$ echo "The fish {{went}} to the {{restaurant}} to eat some {fish} for lunch." |
gawk -v FPAT='{[^}]+}+' -v OFS= '{$1=$1}1'
{{went}}{{restaurant}}{fish}

答案 2 :(得分:1)

以下是另一种使用香草sed的方式:

sed 's/^[^{]*\|[^}]*$//g; s/}[^{}]*{/}{/g' <<< "$variable"

结果:

{{went}}{{restaurant}}{fish}

答案 3 :(得分:1)

派对有点晚了。这是一个perl解决方案。

perl -ne'print for /{[^}]+}+/g'

或者如果您最后选择新行

perl -ne'print for /{[^}]+}+/g }{ print "\n"'

$ echo "The fish {{went}} to the {{restaurant}} to eat some {fish} for lunch." | 
perl -ne'print for /{[^}]+}+/g }{ print "\n"'
{{went}}{{restaurant}}{fish}

答案 4 :(得分:1)

这可能适合你(GNU sed):

sed 's/[^{]*\(\({{*[^}]*}}*\)*\)/\1/g' file

或:

sed -r 's/[^{]*((\{+[^}]*\}+)*)/\1/g' file

假设所有{}均衡。

N.B。这避免了交替。