bash正则表达式获取最后一个特定字符的字符串

时间:2017-04-07 19:58:58

标签: regex bash

让我说我有字符串

TEST='skjd fsd(fghf)h gfjgh(gh jfgh)ghnfg hhg)gfng df'

我想在最后一个右括号中提取所有内容。我不知道有多少括号或字符串的长度。我的输出需要

skjd fsd(fghf)h gfjgh(gh jfgh)ghnfg hhg)

现在,使用sed(sed 's/).*//')我正在起到第一个右括号,但我需要最后一个。

3 个答案:

答案 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更好。

相关问题