Linux:如何仅在包含表达式的行上替换文件中的单词

Linux : How to replace words in files only on lines containing an expression

我想将目录(包括子目录)中包含的所有文件中的“/foo/”表达式替换为“/foo/bar/”,但仅限于包含“.model”的行

例如:

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

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

感谢您的帮助

您可以使用 sed -ifind 轻松做到这一点。您将使用 find 找到所选目录下的所有文件,然后使用 sed 使用 find-execdir 选项就地进行替换,例如

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

正则表达式 /model/s#/foo/#/foo/bar/#g 将仅在包含 "model" 的行上运行,然后使用备用分隔符 '#' 正常替换所有出现的 "/foo/""/foo/bar/" 通过在末尾提供 'g' 选项。 (要仅替换第一次出现的 "/foo/",请从末尾删除 'g')。

如果您还有其他问题,请告诉我。