这是我的代码。我只是想复制一些文件并替换我的Makefile中的一行。参数$ 1只是我的新.tex文件的名称。
#!/bin/bash
pwd="./"
tex=".tex"
pwd=$1$tex
cp ~/TeX/matt.sty .
cp ~/TeX/mon.tex $pwd
cp ~/TeX/Makefile .
sed="sed 's/mon.tex/"$1$tex"/g' Makefile > Makefile"
$sed
我遇到以下错误:sed: 1: "'s/mon.tex/salut.tex/g'": invalid command code '
ps:我在Mac OS X上使用sed。(所以它是bsd sed)
答案 0 :(得分:6)
sed的第一个参数是字面's/mon.tex/"$1$tex"/g'
(带单引号)。显然sed无法将其解析为命令。
删除单引号可以解决该问题,但重定向(>
)仍然无效。
直接运行sed命令($sed
变量的意思是什么?我没有得到它)
注意:要使用sed修改文件,请使用sed -i
。重定向到您正在处理的同一文件将无法正常工作。
答案 1 :(得分:0)
错误消息是由'
(单引号)引起的
而且,'
不是有效的sed
命令。
$ echo="echo 'hello, world'"
$ $echo
'hello, world'
您可以使用 eval
命令更进一步Quote Removal
:
sed="sed 's/mon.tex/"$1$tex"/g' Makefile > Makefile.new"
eval $sed
注意:
>Makefile
会使您的原始Makefile
成为空!因此,请将其更改为Makefile.new
。eval
是邪恶的。尝试直接使用sed
! 答案 2 :(得分:0)
你的sed命令行加倍:
sed="sed 's/mon.tex/"$1$tex"/g'"
创建一个sed
变量。然后,您可以将此变量用作命令:
$sed s/mon.tex$1$tex/g Makefile > Makefile
^^^^---here
有效地使您的命令行:
sed 's/mon.tex/"$1$tex"/g' s/mon.tex$1$tex/g Makefile > Makefile
^^^^^^^^^^^^^^^^^^^^^^^^^^--var
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--- excess args
击> <击> 撞击>
现在我看到你的问题被编辑以删除...所以请忽略这一点,我想。
答案 3 :(得分:0)
你说
sed="sed 's/mon.tex/"$1$tex"/g'"
这会创建一个包含字符串sed
的变量sed 's/mon.text/foo.tex/g'
,假设$1
为foo
,例如。
然后展开$sed
不加引号,它变为
sed ''\''s/mon.tex/foo.tex/g'\'''
其中包含表达开头的文字'
,就好像你说过:
sed -e \''s///'
编辑:重申一下,您的问题是您在变量赋值中不必要地引用了sed
表达式。使用
sed="sed s/mon.tex/$1$tex/g Makefile > Makefile"
它将按预期工作。