假设我有这个虚拟项目:
$tree -L 3 ~/my-proj
./dir/foo.sh
./bar.sh
我想将版权文件头插入到所有 *.sh 文件中,例如我的头是:
/*
* Copyright (c) 2015 by MyCompany, Inc.
* All rights reserved.
*/
我正在努力它是多行的,我设法写了下面的脚本但不适用于多行:
#!/bin/sh
HEADER=$(cat<<EOH
/*
* Copyright (c) 2015 by MyCompany, Inc.
* All rights reserved.
*/
)
find ~/my-proj/*.sh -exec sed -i "1s/^/$HEADER\n/" {} \;
答案1
用这个:
header='/*\n * Copyright (c) 2015 by MyCompany, Inc.\n * All rights reserved.\n */\n'
find ~/my-proj/*.sh -exec sed -i "1s|^|$header|" {} \;
笔记:
shell 会将 的值
$header
直接替换到 sed 命令中。这样就可以将任意命令注入 sed 脚本。执行不是除非你信任该信息的来源,否则不要这么做header
。标头包含
/
字符。要么必须转义这些字符,要么替换命令必须使用不同的分隔符。在上面,|
用作分隔符。最佳实践是使用小写或混合大小写来表示 shell 变量。系统使用大写来表示变量,虽然在这种情况下这不是问题,但您不想意外覆盖一个变量。
例子
为了说明修改后的 sed 命令,请考虑以下测试文件:
$ cat file
1
2
3
sed 命令生成:
$ sed "1s|^|$header|" file
/*
* Copyright (c) 2015 by MyCompany, Inc.
* All rights reserved.
*/
1
2
3