在makefile中用sed匹配并替换字符串

埃蒙

我想搜索一堆MD和HTML文件中以“ id”开头的行,并将字符串“ old”的所有实例替换为字符串“ new”。我在命令行中使用以下命令进行了此操作。

find \( -name '*.md' -o -name '*.html' \) -exec sed -i '/id:/s/old/new/g' '{} \;

但是,我需要从Makefile运行命令。我以前从未做过make。当我将同一命令放入Makefile并尝试从那里执行时,它失败。那时我意识到自己对make知之甚少,因为我天真地认为,如果它在命令行中有效,那么它将在make中有效。我错了。因此,我在该Makefile中查找了执行类似操作的sed命令的一些示例,并提出了以下内容。这不会出错,但也不会对我的文件做任何事情。所以,我很茫然。任何帮助表示赞赏!

switch_old_for_new:
    find \( -name '*.md' -o '*.html' \) -exec sed -i 's#^\(id: \)$(OLD)#\1$(NEW)#' '{}' \; 

注意:您可能会看到,我需要能够从命令行为“ old”和“ new”传递两个实际值,因此我还需要在sed中包含变量。所以我会像这样执行它:

make switch_old_for_new OLD=old NEW=new
Vroomfondel

这似乎已经很晚了,你复制的命令行,使当咖啡跑了出来),这是你的第一个例子腥的唯一的事情就是一个多余的'前右{}其他所有内容在make中均保持不变。在配方中,\它没有特殊的意义,也就是说,如果make在制表符之前的行中找到它,target:则它应该逐字逐句地直接运行到单独的命令行中。唯一值得注意的例外是\换行符之前的权利,例如:

target:
    echo a very long \
    line with a \+newline in it

在这种情况下,make将以\(newline)作为指示,它将\(newline)在一次调用中将当前行与下一行(以及所有后续串联的)一起传递给外壳,而不是在默认情况下为每个配方行单独进行外壳调用。(注:只有选项卡,但不是\(newline)从给外壳的字符串被删除-你需要如果欺骗周围的变量有点\(newline碍眼。)此外,所有类型的引用字符'"而且还背勾号(因此不允许我使用语法字体写)以及glob-characters *?请勿调用任何特殊行为-它们将按原样传递给shell。因此,您的make文件可能如下所示:

switch_old_for_new:
    find . \( -name '*.md' -o -name '*.html' \) -exec sed -i '/id:/s/$(OLD)/$(NEW)/g' {} \;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章