让我说我有字符串
TEST='skjd fsd(fghf)h gfjgh(gh jfgh)ghnfg hhg)gfng df'
我想在最后一个右括号中提取所有内容。我不知道有多少括号或字符串的长度。我的输出需要
skjd fsd(fghf)h gfjgh(gh jfgh)ghnfg hhg)
现在,使用sed(sed 's/).*//'
)我正在起到第一个右括号,但我需要最后一个。
答案 0 :(得分:4)
不使用BASH中的任何正则表达式,您可以使用字符串替换:
str='skjd fsd(fghf)h gfjgh(gh jfgh)ghnfg hhg)gfng df'
echo "${str%)*})"
这将得到以下输出:
skjd fsd(fghf)h gfjgh(gh jfgh)ghnfg hhg)
%)*
会删除从最右边 )
开始到结尾的所有文字。
如果您必须使用正则表达式,则可以使用:
[[ $str =~ ^.*\) ]] && echo "${BASH_REMATCH[0]}"
skjd fsd(fghf)h gfjgh(gh jfgh)ghnfg hhg)
^.*\)
将匹配上一个)
,因为.*
是贪婪匹配。
答案 1 :(得分:1)
sed 方法:
TEST='skjd fsd(fghf)h gfjgh(gh jfgh)ghnfg hhg)gfng df'
echo $TEST | sed -n 's/\(.*[)]\)[^)]*/\1/p'
输出:
skjd fsd(fghf)h gfjgh(gh jfgh)ghnfg hhg)
\(.*[)]\)
- 第一个捕获组,捕获所有字符,直到最后)
grep 替代方案:
echo $TEST | grep -Po '.+\)(?=[^)]*$)'
再一次...... perl 方法:
echo $TEST | perl -nle 'print $1 if /(.+\))[^)]*$/'
和最后一个......是 awk 方法:
echo $TEST | awk -F')' -v OFS=')' '{$NF=""}1'
如您所见,有很多方法可以实现目标)
答案 2 :(得分:1)
使用sed
:
sed 's/[^)]*$//' <<< "${TEST}"
编辑: @anubhava在我发布之前几秒钟将这个答案贴在他自己答案的评论上。他是对的,bash更好。