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

ВХОД:

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

ВЫВОД:

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

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

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

  • Поиск всех элементов массива в другом массиве?
  • Источник «gsed: не может читать: нет такого файла или каталога»?
  • Согласование шаблонов по нескольким строкам
  • Заменить текст между скобками
  • Как найти и заменить текст sed, содержащий звездочку *
  • Заменить шаблон в файле с шаблоном во втором файле
  • Есть ли основной учебник для grep, awk и sed?
  • Как обеспечить, чтобы строка, интерполированная в подстановку sed, избегала всех метамарков
  • 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 - лучшая ОС в мире.