从行尾移回两个点


-5

我需要使用正则表达式删除从行尾开始并返回两个点的所有文本。

gtk2-2.24.22-2.fc20.x86_64

gtk2-2.24.22-2

这是rpm -qa文本文件的输出,我需要切断结尾。


3
好的,您尝试了什么?为什么不起作用?您需要使用哪种正则表达式语言系列?POSIX?扩展的POSIX?Perl的?
slhck

-1,因为它读作是“给代码编!!!!!! 11!”。
Hennes

汉尼斯是正确的。我对正则表达式一无所知,也没有尝试过任何东西,也找不到任何可学习的好资源。
user341814 2014年

2
我发现regular-expressions.info是一个很好的信息来源。也许您至少可以给我们一些背景信息-例如您需要在哪里使用此正则表达式,或者为什么?它在Bash脚本中吗?还是需要独立于平台运行?
slhck

我会检查一下,也许会读一本书“ Mastering Regular Expressions”(Mastering Regular Expressions),这是rpm -qa文本文件的输出,我想像OP中提到的那样删掉结尾。
user341814 2014年

Answers:


1

需要正则表达式吗?我知道这是一个便宜的解决方案,但是正则表达式并不是所有解决方案。

例如,使用Bash字符串操作:

foo="gtk2-2.24.22-2.fc20.x86_64"
echo ${foo%.*.*} # strip the longest match from the last dot

返回gtk2-2.24.22-2

您可以像这样在文件上调用它:

foo=$(head -1 file.txt)
echo ${foo%.*.*} > new-file.txt

正则表达式擅长从开始而不是从后面解析某些内容,因为它们以“贪婪”的方式从左到右消耗。这是可行的,但是您需要比简单的Bash更加冗长。

注意,在Bash(.*)中看起来像正则表达式的不是正则表达式。在真实的正则表达式中,点.代表所有字符,*意味着前一个字符(组)重复0–n次。但是,在Bash中,点.表示实际点,并且*对于所有字符都是通配符。


即使贪婪,大多数正则表达式实现仍会尝试匹配输入,如果需要,可以减少贪婪?因此,类似的内容(.*)\.[^\.]*\.[^\.]*将匹配完整的字符串,但是仅捕获最后两个点之前的内容。但是的确,如果要在Bash中完成,您的答案可能会很容易,这是一个很好的假设,因为它显然是rpm命令的输出。
Arjan 2014年

你是对的。您是否想将解决方案作为单独的答案发布?我有点想表明,在正则表达式的可读性和有用性之间总是要权衡取舍。
slhck 2014年

不,我不喜欢的问题;-)(但随时有,并删除我的意见!)但我不能给予好评两次;-)
阿尔扬·

顺便说一句,只需在我的Mac上进行快速测试:echo "gtk2-2.24.22-2.fc20.x86_64"|sed -E 's/^(.*)\.[^\.]*\.[^\.]*$/\1/'
Arjan 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.