我需要使用正则表达式删除从行尾开始并后退两个点的所有文本。
gtk2-2.24.22-2.fc20.x86_64
变成
gtk2-2.24.22-2
这是文本文件的输出rpm -qa
,我需要截断结尾。
答案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 中,点.
表示实际的点,而*
是所有字符的通配符。