使用 grep、sed 或 awk 查找中间的单词?我希望能够提取直到 .el7 的包名称

使用 grep、sed 或 awk 查找中间的单词?我希望能够提取直到 .el7 的包名称

我正在编写一个脚本(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)。

相关内容