使用shell脚本将脚本从一个文件复制到另一个文件

时间:2014-04-11 21:38:43

标签: shell sed

基本上我想将几行代码从模板文件复制到脚本文件中。 是否甚至可以使用sed复制一个充满与脚本交互的符号的字符串?

我使用了这些行:

$SWAP='sudo cat /home/kaarel/template'
sed -i -e "s/#pointer/${SWAP}/" "script.sh"

输出结果为:

./line-adder.sh: line 11: =sudo cat /home/kaarel/template: No such file or directory

2 个答案:

答案 0 :(得分:0)

该行有两个问题:

$SWAP='sudo cat /home/kaarel/template'

首先,在执行该行之前,bash执行变量扩展,并用$SWAP的当前值替换SWAP。那不是你想要的。您希望bashSWAP分配值。

第二个问题是右侧用单引号括起来,保护字符串免于扩展。你并不想保护字符串免于扩展:你想要执行它。要执行它,您可以使用看起来相似但反应非常不同的反引号。

然而,背引号是一种要求执行命令的古老形式。更现代的形式是$(...),它消除了后引号出现的一些问题。

全部放在一起,使用:

SWAP=$(sudo cat /home/kaarel/template)
sed -i -e "s/#pointer/${SWAP}/" "script.sh"

请注意,如果sed文件中有任何sed-active字符,template命令可能会出现问题。

答案 1 :(得分:0)

不,用sed强行完成这项工作是不可能的。只需使用awk:

awk -v swap="$SWAP" '{sub(/#pointer/,swap)}1' script.sh > tmp && mv tmp script.sh

对于GNU awk的最新版本,如果你关心的话,就会有一个-i inplace标志用于就地编辑。

关于“&&”的好点。这是真正强大的版本,适用于搜索或替换字符串中的任何字符:

awk -v old="#pointer" -v new="$SWAP" 's=index($0,old){$0 = substr($0,1,s-1) new substr($0,s+length(old))} 1'

e.g:

$ echo "abc" | awk -v old="b" -v new="m&&n" 's=index($0,old){$0 = substr($0,1,s-1) new substr($0,s+length(old))} 1'
am&&nc