使用 Sed 将基本文件名解析为替换参数

Using Sed to Parse Base Filename into Replacement Argument

在包含两千多个文本文件的目录中工作,我需要将每个文本文件中的某个字符串从“template.cmp”替换为“actualfilename[=18=” ]”。例如,对于mdgen.cmp这样的文件,我需要将“template.cmp”的原始字符串更改为“mdgen”。

我试过以下命令无济于事:

sed -i 's/template.cmp/$(basename)' ./*

知道如何解决这个问题吗?

在单引号内,$(basename)只是一个静态字符串。如果你想 运行 命令 basename,你需要双引号,你需要给它传递一个参数,如果你想 trim 扩展,你需要传递两个参数。猜测一下你实际上想做什么,比如

for file in *; do
    sed -i "s/template\.cmp/$(basename "$file" .cmp)/" "$file"
done

另请注意正则表达式中的点应该如何使用反斜杠或将其放入字符 class [.] 中进行正确转义;未转义的 . 完全匹配任何字符。