1

Я пишу сценарий (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

Думаю, я должен также отметить, что ep el7 будет в текстовом файле (ах), что также приведет к совпадению с усложняющими 'el7' вещами.

1 ответ1

0

Решение 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).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .