为什么sed不能在我的bash脚本中工作?

时间:2012-02-17 14:14:16

标签: bash sed

这是我的代码。我只是想复制一些文件并替换我的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)

4 个答案:

答案 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

注意:

  1. >Makefile会使您的原始Makefile成为空!因此,请将其更改为Makefile.new
  2. 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',假设$1foo,例如。

然后展开$sed不加引号,它变为

sed ''\''s/mon.tex/foo.tex/g'\'''

其中包含表达开头的文字',就好像你说过:

sed -e \''s///' 

编辑:重申一下,您的问题是您在变量赋值中不必要地引用了sed表达式。使用

sed="sed s/mon.tex/$1$tex/g Makefile > Makefile"

它将按预期工作。