Вернуть слово перед совпадающим словом, используя sed

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

There are 12 processes running. 

Здесь я использую sed для поиска текстовых processes и я бы просто хотел напечатать 12 .

Возможно ли использование sed ?

  • Проблема с передачей переменной sed
  • Соответствие пяти столбцов в двух файлах с использованием Awk
  • Использование awk и grep для результатов iftop
  • Получить текущий часовой пояс на Centos 7
  • Необходимо удалить - (минус) знак в конце в количестве из многих столбцов и вставить его на удаленные столбцы
  • Вставить строку после сопоставления строки в sshd внутри pam.d
  • Использование команды sed в Unix
  • Как я могу использовать sed или ex для замены блока (многострочный код) новым блоком текста (кода)?
  • 3 Solutions collect form web for “Вернуть слово перед совпадающим словом, используя sed”

    Если вам нужно обработать только одну строку, вы можете использовать команду sed

     sed -e 's/.* \([[:digit:]]\{1,\}\) processes running\./\1/' 

    Для немного более надежного подхода, следующий скрипт будет принимать произвольный ввод и отвечать только, если что-то совпадающее

     sed -ne 's/.* \([[:digit:]]\{1,\}\) processes running\./\1/p' 

    Вместо того, чтобы использовать сложную замену sed , вы можете просто использовать поиск и cut grep с фиксированной строкой:

     $ grep -F 'processes' file | cut -d ' ' -f 3 

    Как я понимаю, вам просто нужно найти какое-либо слово (в общем случае) и напечатать слово раньше.

    Решение в GNU sed :

     sed -rn 's/(^|(.* ))([^ ]*) YOUR_WORD(( .*)|$)/\3/; T; p; q' 

    объяснение

    -r – расширенное GNU regexp;

    -n – команда не печатать;

    (^|(.* )) – префикс перед словом того, что вы хотите распечатать. Это может быть начало строки ( ^ ) или ( | ) пробельных символов ( (.* ) );

    ([^ ])*) – слово, которое будет напечатано ( \3 );

    YOUR_WORD – замените его на слово, после того, как найдете слово. (Как «бег» после «процесса»);

    (( .*)|$) – конец строки после слов, конец ( $ ) или пробел и некоторые символы;

    \3 найдено слово;

    T – «переход к завершению, если замена не выполнена успешно», расширение GNU. Он перейдет к концу скрипта для каждой строки, которая не содержит YOUR_WORD как не первое слово;

    p – «буфер печати», распечатать найденное слово (если T не работает в этой строке);

    q – команда для остановки выполнения sed , потому что мы уже нашли слово (не прыгали с T ), и нам не нужно искать новые слова.

    Обновление: решение без расширений GNU

     sed -n 's/\(^\|\(.* \)\)\([^ ]*\) YOUR_WORD\(\( .*\)\|$\)/\3/; tprint; b; :print; p; q 

    Объяснение такое же, разница в обратных косых чертах и t . t работает как T , но прыгает, если замена была успешной. Если это так, мы переходим к «print and quit», если нет – b посылает, как и для скрипта и последующей обработки строки.

    Interesting Posts

    Как настроить Cygwin для автоматического обновления и загрузки без GUI?

    Как выполнить команду find в сценарии оболочки без получения сообщения об ошибке «Отсутствующий аргумент для -execdir»?

    как распаковывать / распаковывать сегментированные zip-файлы?

    Команда dd не реагирует при попытке создать загрузочный USB-носитель в Debian?

    Предоставление разрешений для изменения разрешений

    Невозможно подключиться к Интернету после использования проверки с помощью airmon-ng

    Прерывая rsync с помощью ctrl-c, следует ли использовать `–partial` или` –append`?

    Меню Bash с несколькими параметрами в одной строке

    Как установить аппаратные зависимости в .deb-пакеты?

    Автоматическая перезагрузка измененного файла теряется в позиции Zathura

    Как извлечь XML из текстового файла

    Ping несколько хостов и команда выполнения

    Как очистить локальный DNS-кеш в CentOS

    Есть ли файл конфигурации для telnet, который похож на .ssh / config?

    Bad Substition как заставить / bin / bash как оболочку?

    Linux и Unix - лучшая ОС в мире.