我需要删除{
和}
括号外的所有数据。例如,这里是$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
如何进行适当的修改,以便其中一个删除大括号外的所有数据?
答案 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。这避免了交替。