循环所有文件并插入文件头

循环所有文件并插入文件头

假设我有这个虚拟项目:

$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|" {} \;

笔记:

  1. shell 会将 的值$header直接替换到 sed 命令中。这样就可以将任意命令注入 sed 脚本。执行不是除非你信任该信息的来源,否则不要这么做header

  2. 标头包含/字符。要么必须转义这些字符,要么替换命令必须使用不同的分隔符。在上面,|用作分隔符。

  3. 最佳实践是使用小写或混合大小写来表示 shell 变量。系统使用大写来表示变量,虽然在这种情况下这不是问题,但您不想意外覆盖一个变量。

例子

为了说明修改后的 sed 命令,请考虑以下测试文件:

$ cat file
1
2
3

sed 命令生成:

$ sed "1s|^|$header|" file
/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */
1
2
3

相关内容