我想搜索一堆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
这似乎已经很晚了,你复制的命令行,使当咖啡跑了出来),这是你的第一个例子腥的唯一的事情就是一个多余的'
前右{}
。其他所有内容在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] 删除。
我来说两句