【问题标题】:Using variable with sed in Shell Script在 Shell 脚本中使用带有 sed 的变量
【发布时间】:2010-10-20 19:08:15
【问题描述】:

我正在编写一个 shell 脚本来编辑 宙斯盾的变更集属性。这 我正在使用的命令是:

aegis -Change_Attributes -Edit

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

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

\"测试\"/g

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

附:该文件是一个临时文件 执行命令时创建所以 我不知道原来的路径

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

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

\"测试\"\;/g'

解决方案(不雅的黑客??) 是“cat”来自aegis的输出 (setenv VISUAL cat),修改out 用上面的命令放流和 将其保存到临时文件中,然后使用:

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

工作。我将普通分隔符 (/) 替换为 % 并将环境变量放在双引号中。

【问题讨论】:

    标签: shell sed


    【解决方案1】:

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

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

    【讨论】:

    • 如果我使用 cat 并使用 sed 修改输出,这些更改会保留到文件中吗?
    • 不,您必须将 sed 的输出重定向到某个地方,在本例中为临时文件。然后当编辑完成后,删除原始文件并重命名临时文件。
    • 如果你使用 GNU sed,你可以使用 -i 标志来编辑文件。
    • 当我使用双引号时: //sed -i "s/brief_description\ \=\ \"none\"\;/$DESC/g" 我收到一条错误消息,说 //Unmatched "。 // 我尝试了其他几种方法: //sed -i 's/brief_description\ \=\ \"none\"\;/'"$DESC'"/g'// //sed -i 's%brief_description\ \=\ \"none\"\;%'"$DESC'"%g'// 但这些似乎都不起作用。我正在使用 csh 而不是 bash,所以这可能是一个问题
    • csh 从来没有被设计用于 fpr 编写脚本 - 如果你没有 bash,请改用 sh
    【解决方案2】:

    如果您通过 -c 选项传入所需的命令,那么 vi 将在启动编辑会话后立即执行该命令,例如

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

    哎呀。我忘了说该命令被解释为“ex”命令,即在冒号处,因此您提供的命令应该可以工作。

    HTH

    干杯,

    【讨论】:

    • 是的。这就是我一直在寻找的。不幸的是,我没有打开 vi 会话,所以我无法传递任何命令行选项。我已经使用 cat 代替
    • 如果你真的想使用 vi,你可以做到 - 只需在我建议的脚本中使用它而不是 sed。我认为使用 sed 更好——我不认为它不雅。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 2023-03-16
      • 1970-01-01
      • 2013-09-16
      • 2010-11-13
      • 1970-01-01
      相关资源
      最近更新 更多