![使用 grep、sed 或 awk 查找中间的单词?我希望能够提取直到 .el7 的包名称](https://linux22.com/image/1428991/%E4%BD%BF%E7%94%A8%20grep%E3%80%81sed%20%E6%88%96%20awk%20%E6%9F%A5%E6%89%BE%E4%B8%AD%E9%97%B4%E7%9A%84%E5%8D%95%E8%AF%8D%EF%BC%9F%E6%88%91%E5%B8%8C%E6%9C%9B%E8%83%BD%E5%A4%9F%E6%8F%90%E5%8F%96%E7%9B%B4%E5%88%B0%20.el7%20%E7%9A%84%E5%8C%85%E5%90%8D%E7%A7%B0.png)
我正在编写一个脚本(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
)。