从头开始删除直到字符串中的某个部分

时间:2011-06-16 15:52:43

标签: perl string bash sed awk

我使用像

这样的字符串
abc_dsdsds_ss_gsgsdsfsdf_ewew_wewewewewew_adf

我需要得到一个新的,我在原始字符串中删除从“_”的开头到最后一次出现的所有内容以及下一个字符(可以是3,4,或任何数字)

所以在这种情况下我会得到

_adf

我怎么能用“sed”或其他bash工具来做呢?

8 个答案:

答案 0 :(得分:5)

正则表达式模式匹配是贪婪的。因此^。* _将匹配所有字符,包括最后一个_。然后将下划线放回:

echo abc_dsdsds_ss_gsgsdsfsdf_ewew_wewewewewew_adf | sed 's/^.*_/_/'

答案 1 :(得分:1)

sed 's/^(.*)_([^_]*)$/_\2/' < input.txt

答案 2 :(得分:1)

答案 3 :(得分:1)

答案 4 :(得分:1)

答案 5 :(得分:1)

如果你在bash变量中有这样的字符串(我没有看到问题中指定的字符串),你可以使用parameter expansion

s="abc_dsdsds_ss_gsgsdsfsdf_ewew_wewewewewew_adf"
t="_${s##*_}"
echo "$t"  # ==> _adf

答案 6 :(得分:0)

Perl方式:

echo 'abc_dsdsds_ss_gsgsdsfsdf_ewew_wewewewewew_adf' | \
perl -e 'print ((split/(_)/,<>)[-2..-1])'

<强>输出:

_adf

答案 7 :(得分:0)

只是为了好玩:

echo abc_dsdsds_ss_gsgsdsfsdf_ewew_wewewewewew_adf | tr _ '\n' | tail -n 1 | rev | tr '\n' _ | rev
相关问题