Как написать регулярное выражение для этого? - PullRequest
0 голосов
/ 18 января 2019

Требования: только grep / cut / join / regex.

У меня есть такие данные:

  798 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
15386 /usr/bin/nautilus --gapplication-service
16051 /usr/bin/zeitgeist-daemon

Я хочу извлечь данные строк из числа во второе конечное пространство, например

798 /usr/bin/dbus-daemon

с использованием только grep / cut / join с или без регулярного выражения.

Я пытался

grep -oe "[^ ][^ ]*  *[a-zA-Z\]*$"

но результат не такой, как ожидалось.

1 Ответ

0 голосов
/ 18 января 2019

Вы можете использовать

# With GNU grep:
grep -oP '^\s*\K\S+\s+\S+' <<< "$s"
# With a POSIX ERE pattern:
grep -oE '[0-9][^ ]* +[^ ]+' <<< "$s" 

См. онлайн демо

  • o - соответствует режиму вывода (не линия)
  • P - для анализа шаблона используется механизм регулярных выражений PCRE

Детали шаблона PCRE:

  • ^ - начало строки
  • \s* - 0+ пробелов
  • \K - оператор сброса совпадений, отбрасывающий весь найденный текст
  • \S+ - 1+ непробельных символов
  • \s+\S+ - 1+ пробелов и 1+ непробельных символов.

Шаблон POSIX ERE соответствует

  • [0-9] - цифра
  • [^ ]* - 0+ символов кроме пробела
  • + - 1 или более пробелов
  • [^ ]+ - 1+ символов, кроме пробела.
...