循環所有文件並插入文件頭

循環所有文件並插入文件頭

假設我有這個虛擬專案:

$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

相關內容