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

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

There are 12 processes running. 

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

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

  • Как добавить некоторую строку в соответствие с предыдущей строкой, сопоставленной с sed?
  • Есть ли более быстрый способ удалить строку (учитывая номер строки) из файла?
  • Удаление определенных символов из нескольких файлов с помощью белых кликов
  • Объединить и добавить столбцы для более чем двух файлов
  • Как добавить нуль (0) в пробелы в большом файле (пример файла ниже)
  • Слово поиска, которому предшествует имя в Sed
  • awk удаляет строки на основе другого значения столбца
  • изменить конкретный столбец с помощью sed или awk
  • 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

    загрузочный раздел почти заполнен в CentOS

    Перемещение домой и резервное копирование на другой раздел

    как файловое вредоносное ПО работает на Linux?

    Оператор Bash OR не оценивает несколько переменных

    Существуют ли различия между установкой файловой системы / proc в chroot по сравнению с монтированием ее снаружи?

    общая файловая система с автономным доступом

    Изменение способа отображения имени каталога в терминале Ubuntu

    Использование apt или aptitude для получения информации о версии об удаленном пакете?

    Как выбрать строку с последней датой и временем

    Отправляется ли процесс отказа от сигналов, отличных от SIGHUP?

    Не удается подключиться к статическому IP-адресу Virtualbox VM, который находится в другой подсети от IP-адреса хоста, но статически маршрутизирован на хост HW addr

    объединение игнорирования grep и совпадений

    Как установить AMD Catalyst на Kali 2.0 32bit

    linux: Как определить лучший формат файловой системы?

    Менеджер разделов, который может работать с LVM?

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