基本上我想将几行代码从模板文件复制到脚本文件中。
是否甚至可以使用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
答案 0 :(得分:0)
该行有两个问题:
$SWAP='sudo cat /home/kaarel/template'
首先,在执行该行之前,bash
执行变量扩展,并用$SWAP
的当前值替换SWAP
。那不是你想要的。您希望bash
为SWAP
分配值。
第二个问题是右侧用单引号括起来,保护字符串免于扩展。你并不想保护字符串免于扩展:你想要执行它。要执行它,您可以使用看起来相似但反应非常不同的反引号。
然而,背引号是一种要求执行命令的古老形式。更现代的形式是$(...)
,它消除了后引号出现的一些问题。
全部放在一起,使用:
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