Linxu如何使用正则匹配不在一行的{}里面的内容?

一个Linux的替换题目

题目要求:把{}内的oldboy替换为oldgirl,但是必须要先用正则匹配{}里面的内容再进行替换

oldboy
{
oldboy
oldgirl
}
oldboy
oldgirl
{
oldgirl
oldboy
}

目前就是不知道如何使用正则匹配{}里面的内容,百度谷歌都用了,还是不知道,求大神指导下,谢谢。

oldboy
{
oldboy
oldgirl
}
oldboy
oldgirl
{
oldgirl
oldboy
}

以下用sublime text 编辑器试过可以.

//find: ({[^{]*?)(oldboy)+([^}]*?})
//replace: \1oldgirl\3

([{]\w*(oldboy)+\w*[}])

有一个难点没法解决,就是换行问题,所以提供一种迂回解决方案。
格式化内容,将{} 完整作为一行的内容,然后遍历文件的每一行,如果当前行包含花括号,则替换并回写。参考 Shell 脚本为:
格式化文件 info.txt:

oldboy
{oldboy oldgirl}
oldboy
oldgirl
{oldgirl oldboy}

Shell 脚本:

    info=info.txt
    touch result.txt
    while read clname1
    do
        left=`echo $clname1 | grep {`
        right=`echo $clname1 | grep }`

        if [[ "$left" != "" ]] && [[ "$right" != "" ]] ; then
          echo "include"
          echo ${clname1//oldboy/oldgirl} >> result.txt
        else
          echo "not include"
          echo $clname1 >> result.txt
        fi
    done<$info

result.txt 作为替换后的文件,逐行读取 info.txt 中的文件判断是否同时包含 {} ,再将该行中的 oldbody 替换为 oldgirl.

sed -n '/{/,/}/p' ceshi.txt |sed 's/oldboy/oldgirl/'