在Shell脚本中使用带有sed的变量

时间:2009-04-21 10:47:50

标签: shell sed

我正在编写一个shell脚本进行编辑  更改 - 设置aegis的属性。该  我正在使用的命令是:

aegis -Change_Attributes -Edit

打开一个vi编辑器来携带  出了变化。我想做一个搜索  并替换:

s/brief_description \= \"none\"\;/brief_description \=
     

\ “测试\”/克

我可以将这些直接传递到开放状态  vi实例通过脚本没有  输入任何一个?我想保存  编辑后的文件(:wq)。

P.S。该文件是临时文件  在执行命令时创建  我不知道原来的路径

编辑:在这种情况下我可以使用sed:

sed -e 's/brief_description\ \=\ \"none\"\;/brief_description\ \=\
     

\“test \”\; / g'

解决方案(不优雅的黑客??)会  是为了“猫”来自aegis的输出  (setenv VISUAL猫),修改出来  用上面的命令放入流和  将其保存到临时文件,并使用:

aegis -change_attributes -file <temp file>

EDIT2:我几乎得到了它的工作。但是我使用sed

的方式存在问题

我的脚本中有以下行:

sed -i 's/brief_description\ \=\ \"none\"\;/brief_description\ \=\ \"${DESC}\"\;/g' temp_next.txt

但$ DESC变量不评估其值,输出结果为:

  

brief_description =“$ {DESC}”;

如何将DESC传递给sed,它会评估它的实际值?

EDIT3:

使用

sed -i 's%brief_description\ \=\ \"none\"\;%brief_description\ \=\ \"'"$DESC"'\"\;%g' temp_next.txt

的工作。我用%替换正常分隔符(/)并将环境变量放在双引号中。

3 个答案:

答案 0 :(得分:5)

您不需要知道路径 - aegis应用程序将提供该路径。您需要更改环境变量,该变量指定编辑器用于指向脚本的编辑器,并在该脚本中使用sed流编辑器执行编辑。

编辑:关于变量名称扩展问题,将包含整个sed替换表达式的单引号集更改为双引号。单引号关闭变量替换。

答案 1 :(得分:2)

如果通过-c选项传递所需命令,则vi将在启动编辑会话后立即执行命令,例如

vi -c 's/brief_description \= \"none\"\;/brief_description \= \"test\"/g' my_file

糟糕。我忘了说命令被解释为“ex”命令,即在冒号处,所以你提供的命令应该有用。

HTH

欢呼声,

答案 2 :(得分:0)

我不认为vanilla vi会这样做,虽然vim可能能够在自定义.vimrc的控制下实现这一点。更好的方法是使用sed进行更改,然后在结果上打开vi。