【问题标题】:How can I give special command (insert) to vi?如何给 vi 提供特殊命令(插入)?
【发布时间】:2021-01-17 21:09:36
【问题描述】:

我记得通过输入命令“编程”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 命令中不好用)。

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

非常感谢。 乔。

【问题讨论】:

    标签: linux shell vi


    【解决方案1】:

    您不应该将 vi 用于非交互式编辑。已经有另一个工具可以做到这一点,它叫做sedstream editor

    你想做的是

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

    替换你的 vi 命令。

    【讨论】:

    • 好的,谢谢。非常适合更改数据,太棒了。!但是,假设我必须在我的文件中搜索一个字符串,转到行尾,添加另一个字符串并保存/退出。 sed 可以做到这一点吗?
    • sed '/searched_string_in_file/s/replace/this/; $s/^/add this on end/'
    • 哈,是的,很有趣!我会试试的。谢谢。
    • 什么意思?上面的 sed 命令将在整个文件中查找“min​​imod”并替换为定义为 $MODNAME 的任何内容。这就是我从问题中的 vi 命令所理解的。你想插入另一个字符串吗?
    • 是的,我想在文件中的特殊位置插入文本,例如在此文件中搜索之后。设置一个变量(variable=value)应该是个思路。
    【解决方案2】:

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

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

    或者,如果您使用未实现 here strings 的旧 shell:

    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
    

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

    当然,最好使用合适的工具来完成这项工作,如@IsaA 答案所示,sedawk 用于更复杂的命令。

    【讨论】:

    • 是的,罗德里戈。我见过 ex 命令,但是是否可以使用 ex 在文件中添加文本?​​
    • 当然可以:命令a 追加行,然后是行本身,以及带有单独. 的行以返回命令模式。
    • 在您的示例中,您添加 3
    • 您必须将命令放在ex 标准输入中,有很多方法可以做到这一点。最简单的方法是将命令写入文件cmd.txt,然后写入ex source.c &lt; cmd.txt。我正在使用一个鲜为人知但也应该工作的 "here string",只是要小心引号!
    • 对不起罗德里戈。不一定明白。我可以直接在 shell 中使用 ex 命令(如上面的示例)吗?使用“
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多