假設我有這個虛擬專案:
$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