我有数百个源代码文件。我想根据文件名路径重命名命名空间。当然斜线必须用点代替。
我尝试过查找-执行但我无法获取里面的文件名sed将当前命名空间替换为路径。
find -type f -iname *.cs -exec sh -c 'x="{}"; sed -E "s/\//./; s/(namespace.Project).+/\1.$x/" {}' \;
但我得到
sed:-e 表达式 #1,字符 36:“s”的未知选项
答案1
第一个sed
命令 ( s/\//./
) 将用文件中的点替换所有斜杠内容,不在文件名中。
第二个sed
命令 ( s/(namespace.Project).+/\1.$x/
) 会将$x
(仍然未更改的文件路径)添加到命名空间。这会产生错误,sed
因为它包含由 解释的未转义斜杠sed
。
看这个相关问题。
另外,请继续阅读如何find -exec sh -c
安全使用。直接添加{}
到 bash 内容是一场安全噩梦。
答案2
好吧,我找到了我的方法……使用 bash 变量。像这样的东西:
for i in `find -type f -iname *.cs`; do j=$(echo $i|sed -E 's/\.\//namespace Project\//g;s/\//./g; s/(\.[[:alnum:]]*\.cs$)//g'); sed -i -E "s/(namespace Project.+)/$j/g" $i ; done;