我正在编写一个脚本(bash/命令行),我希望能够提取包名称直到 .el7
x=dbus-sharp
(示例包名称 - 会发生变化)
示例文本文件:
Building dbus-sharp-0.7.0-11.fc22 for epel7
Created task: 7970206
...
0 free 1 open 1 done 0 failed
7970225 buildArch (dbus-sharp-0.7.0-11.el7.src.rpm, ppc64): free
7970223 buildArch (dbus-sharp-0.7.0-11.el7.src.rpm, x86_64): open (buildhw-03.phx2.fedoraproject.org)
...
基本上现在我想要
y=dbus-sharp-0.7.0-11.el7
无论我需要使用 grep、sed 还是 awk 都没关系。
我还没有在谷歌上搜索到类似的解决方案。
我尝试过的例子:
[me@h dbus-sharp]$ echo "Here is a String" | grep -Po '(?<=(Here )).*(?= String)'
is a
[me@h dbus-sharp]$ cat scratchdbus-sharp | grep -Po '(?<=(dbus)).*(?= el7)'
(no output?)
[me@h dbus-sharp]$ cat scratchdbus-sharp | awk '/dbus/,/el7/'
(it dumps the whole text file?)
[me@h dbus-sharp]$ sed -n "/dbus/,/el7/p" scratchdbus-sharp
(again the whole text file is dumped)
[me@h dbus-sharp]$ grep -m 1 "dbus-sharp" scratchdbus-sharp
Building dbus-sharp-0.7.0-11.fc22 for epel7
我想我还应该注意到EPel7 将出现在文本文件中,这也会导致“el7”匹配,从而使事情变得复杂。
答案1
一个grep
办法:
grep -m 1 -oP 'dbus[^ ]+\.el7' file
-m 1
仅打印一个匹配项,-o
仅打印匹配的部分,并且 -P 使用 Perl 正则表达式。
解决方案如下sed
:
sed -n 's/.*\(dbus.*\.el7\).*/\1/p' file | head -1
删除前后所有内容dbus.*el7
并打印 ( p
),但仅打印第一个匹配项 ( head -1
)。