Как обрабатывать только те строки, которые содержат заданную строку?

ВХОД:

Select ASDF 325 sdfg sdflk lk Select TRG 46sdg rasdftz fsgs 45 Select ASDF 6ffg sdfg 4456 sdrg 

ВЫВОД:

  • Получить каждый столбец, который содержит несколько пробелов?
  • Анализ вывода команды df с помощью awk
  • Как выбрать, скопировать и вставить некоторые столбцы из разных файлов и создать из них один файл?
  • awk вызывает утечку памяти?
  • UNIX вставляют столбцы и вставляют нули для всех отсутствующих значений
  • В чем смысл использования нескольких восклицательных знаков в sed?
  •  Select ASDF 325 XXXX sdflk lk Select TRG 46sdg rasdftz fsgs 45 Select ASDF 6ffg XXXX 4456 sdrg 

    Короче, мне нужно «sed» «sdfg» на «XXXX».

    НО: только в строках, содержащих строку «Выбрать ASDF». Как я могу это сделать? (sed, awk и т. д.: \)

  • Вычислить медианное значение для столбца и сказать, если это значение «ОК» или «ОШИБКА», если оно находится в допустимом диапазоне
  • Как печатать из заданного диапазона ip-адресов каждый класс-c с последним октетом, замененным звездочкой
  • Извлечение данных из сложной файловой структуры
  • Использовать awk для печати и редактирования даты
  • Ошибка `sed` regexp
  • Сравните два файла и распечатайте общие поля и их соответствующие номера строк в 1-м файле
  • 3 Solutions collect form web for “Как обрабатывать только те строки, которые содержат заданную строку?”

    Вы можете префикс большинства команд sed с адресом, чтобы ограничить линии, к которым они применяются. Адрес может быть номером строки или регулярным выражением, разделенным символом / .

     cat INPUT | sed '/Select ASDF/ s=sdfg=XXXX=' 

    Как уже упоминалось, Peter.O, команда, написанная выше, заменит первое вхождение любого sdfg в строке, содержащей Select ASDF . Если вам нужно подставить точное соответствие sdfg только в том случае, если оно находится в четвертом столбце, вы должны пойти следующим образом:

     cat INPUT | sed 's/\(^Select ASDF [^ ]* \)sdfg /\1XXXX /' 

    Если вы только меняете столбец 4, если он имеет точное значение, то использование операторов равенства вместо регулярных выражений имеет смысл.

     awk '$1 == "Select" && $2 == "ASDF" && $4 == "sdfg" {$4 = "XXXX"} {print}' 

    Использование GNU awk :

     awk ' BEGIN { IGNORECASE = 1 } /^select asdf/ { sub( /\<sdfg\>/, "XXXX", $0 ) } { print } ' infile 

    Вывод:

     Select ASDF 325 XXXX sdflk lk Select TRG 46sdg rasdftz fsgs 45 Select ASDF 6ffg XXXX 4456 sdrg 

    ОБНОВЛЕНИЕ : избегайте IGNORECASE для не-GNU awk и IGNORECASE . Благодаря jw013 , который указал на эту деталь:

     awk ' /^Select ASDF/ { sub( /\<sdfg\>/, "XXXX", $0 ) } { print } ' infile 
    Linux и Unix - лучшая ОС в мире.