Linux: как заменить слова в файлах только на строках, содержащих выражение

#linux #sed #expression

#linux #sed #выражение

Вопрос:

Я хотел бы заменить во всех файлах, содержащихся в каталоге (включая подкаталоги), выражение ‘/ foo /’ на ‘/ foo / bar /’, но только в строках, содержащих ‘.model’

пример :

 import {....} from '../foo/toto.model' => import {....} from '../foo/bar/toto.model

import {....} from '../foo/toto.service' => unchanged
 

Спасибо за вашу помощь

Ответ №1:

Вы можете сделать это довольно легко с sed -i помощью and find . Вы будете использовать find для поиска всех файлов ниже выбранного каталога, а затем использовать sed для выполнения замены на месте, используя -execdir опцию find , например

 find /some/path -type f -execdir sed -i "/model/s#/foo/#/foo/bar/#g" '{}'  
 

Регулярное выражение /model/s#/foo/#/foo/bar/#g будет работать только со строками, содержащими "model" и затем использующими альтернативные разделители '#' для обычной замены всех вхождений "/foo/" with "/foo/bar/" , указав 'g' опцию в конце. (чтобы заменить только первое вхождение "/foo/" , удалите 'g' с конца).

Дайте мне знать, если у вас возникнут дополнительные вопросы.