繁体   English   中英

如何给 vi 提供特殊命令(插入)?

[英]How can I give special command (insert) to vi?

我记得通过使用输入命令“编程”它来用vi做魔术,但我不记得具体是怎么做的。

我的特殊要求是:

  • 使用要执行的命令在脚本中启动vi
  • 在一个文件中插入。
  • 在文件中搜索字符串。
  • vi命令行中使用$VARIABLE来替换命令中的某些内容。
  • :wq结束。

我的记忆中,我发送的命令与 vi 中的完全一样,并且 ESC 键被 '[' 或附近的东西模拟。

我在脚本中使用了这个命令来编辑和更改文件。

我将看到 -c 选项,但现在我不能使用 $VARIABLE 并且插入是不可能的(使用“i”或“o”)。

#!/bin/sh
#

cp ../data/* .

# Retrieve filename.
MODNAME=$(pwd | awk -F'-' '{ print $2 }')

mv minimod.c $MODNAME.c

# Edit and change filename into the file (from mimimod to the content of $VARIABLE).
vi $MODENAME.c -c ":1,$s/minimod/$MODNAME/" -c ':wq!'

这个例子不起作用(似乎 $VARIABLE 在 -c 命令中不好)。

你能帮我记住记忆吗 ;) ?

非常感谢。 乔。

您不应将 vi 用于非交互式编辑。 已经有另一个工具,它被称为sedstream editor

你想做的是

sed -i 's/minimod/'$MODNAME'/g' $MODNAME.c

替换你的 vi 命令。

也许您正在寻找可以非交互运行的ex命令:

ex $MODENAME.c <<< "1,\$s/minimod/$MODNAME/
wq!
"

或者,如果您使用未在此处实现字符串的旧外壳:

ex $MODENAME.c << EOF
1,\$s/minimod/$MODNAME/
wq!
EOF

或者,如果您也不想使用此处的文档

echo "1,\$s/minimod/$MODNAME/" > cmds.txt
echo "wq!" >> cmds.txt
ex $MODENAME.c < cmds.txt
rm cmds.txt

标准输入中每行一个命令。 只要记住不要写领先的: 查看此页面以快速查看ex命令。

当然,最好使用合适的工具来完成这项工作,这将是sed ,正如@IsaA 的回答所暗示的那样,或者awk用于更复杂的命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM