|
本帖最后由 likeyouli 于 2024-9-27 16:29 编辑
以解决,谢谢7楼。
待搜索内容:
zlib-1.2.7-18.el7.x86_64.gpm
zlib-devel-1.2.7-18.el7.i686.rpm
zlib-devel-1.2.7-18.el7.x86_64.rpm
zlib-static-1.2.7-18.el7.i686.rpm
zlib-static-1.2.7-18.el7.x86_64.rpm
zsh-5.0.2-34.el7_8.2.x86_64.rdm
zsh-html-5.0.2-34.el7_8.2.x86_64.rpg
zziplib-0.13.62-12.el7.i686.rpm
zziplib-0.13.62-12.el7.x86_64.rpm
zziplib-devel-0.13.62-12.el7.i686.rpm
zziplib-devel-0.13.62-12.el7.x86_64.rpm
zziplib-utils-0.13.62-12.el7.x86_64.rpm
匹配以 “.rpm” 结尾的除了“.rpm”之外的内容,如:zziplib-devel-0.13.62-12.el7.i686.rpm,我只想匹配出 zziplib-devel-0.13.62-12.el7.i686
不知道这个正则表达式该怎样写 ? 百度搜索出来的,请先测试后再回帖,因为我也百度了好多次,测试后发现都不行。
7楼的可以:.*(?=\.rpm$) (?=xxx) 表示在xxx前边
——————————————————————————————————————————————————————————————————————————————————————————————————————————————
以上为原题,升级为以下题目,centos系统(iso镜像)挂载后(顺便说一下挂载命令①mkdir /likeyou,根目录下创建likeyou文件夹;②mount /dev/cdrom /likeyou 提示:mount: /dev/sr0 写保护,将以只读方式挂载。重新进入likeyou文件夹即可看到挂载的文件。),打开Packages文件夹,ls,会看到以下类似包:
yum-plugin-versionlock-1.1.31-54.el7_8.noarch.rpm
yum-rhn-plugin-2.0.1-10.el7.noarch.rpm
yum-updateonboot-1.1.31-54.el7_8.noarch.rpm
yum-utils-1.1.31-54.el7_8.noarch.rpm
zenity-3.28.1-1.el7.x86_64.rpm
zip-3.0-11.el7.x86_64.rpm
zlib-1.2.7-18.el7.i686.rpm
zlib-1.2.7-18.el7.x86_64.rpm
zlib-devel-1.2.7-18.el7.i686.rpm
zlib-devel-1.2.7-18.el7.x86_64.rpm
zlib-static-1.2.7-18.el7.i686.rpm
zlib-static-1.2.7-18.el7.x86_64.rpm
zsh-5.0.2-34.el7_8.2.x86_64.rpm
zsh-html-5.0.2-34.el7_8.2.x86_64.rpm
zziplib-0.13.62-12.el7.i686.rpm
zziplib-0.13.62-12.el7.x86_64.rpm
zziplib-devel-0.13.62-12.el7.i686.rpm
zziplib-devel-0.13.62-12.el7.x86_64.rpm
zziplib-utils-0.13.62-12.el7.x86_64.rpm
要求:提取每行中以.rpm结尾、倒数第一个.与倒数第二个点之间的内容,也就是类似x86_64、i686、noarch这样的内容,这些其实代表的是这个包支持的架构。
我发现提取的方式多种多样,比如用cut、rev,awk,有些还得配合正则表达式才能完成,但仅用一个表达式就能提取出来的只有正则表达式:
ls|grep -Po '[^\.]+(?=\.rpm$)' 然后就可以|sort|uniq -c 排序、去重并统计重复个数。
正则表达式魅力无限啊 又想到一个题目:不管最后一个.后边是不是rpm,我就要求取倒数第一个.与倒数第二个.之间的内容,也就是类似x86_64、i686、noarch这样的内容,可以这样写: ls|grep -Po '[^.]+(?=\.[^.]+$)' , 多次测试,发现[ ] 这里边无论写. 还是写\. 好像都行,难道中括号里边的. 就是点,而不是元字符?经过测试发现,反选时中括号里边[^.] 与 [^\.] 表示的意思一样,都是表示除了点之外的内容。______________________________________________________________________________________________
继续发散:如果要取倒数第二个点与倒数第三个点之间的内容呢 ?也就是el7,那就可以这样写:
ls|grep -P '[^.]+(?=\.[^.]+\.[^.]+$)' ,正则表达式实在太灵活了,有了它,还要什么awk啊, 据说awk取列还相当复杂,除了awk取的列能直接运算、能重新排列,除此之外,单纯提取内容相对于正则表达式就是渣。
|
|