使用 Vim 从脚本更改文件中的数值

使用 Vim 从脚本更改文件中的数值

我需要从命令行更改存储在文本文件中的变量的数值。

我曾尝试使用 Bash 编写脚本,但只成功了这么一点:

#!/bin/bash
clear
vim The_Generator.c

(This is hopefully where I modify the The_Generator.c file).

-c 'wq'

答案1

Vim 不是完成此任务的最佳方法,但有可能:

$ vim -c '%s/^\(VARIABLE=\)\d\+/\13/' -c wq The_Generator.c

%s在 Vi 中表示“全局搜索和替换”。搜索模式查找以 开头,VARIABLE=后跟一个或多个数字 ( \d+) 的行,然后将数字替换为3,这是我为了此处的示例而选择的变量的新值。该VARIABLE=零件被放回生产线\1 反向引用

这里有几个弱点使得这不是最理想的:

  1. 对于像这样的简单任务来说,Vim 是一个相当繁重的程序。请注意,执行此操作时,您会看到全屏vi界面的短暂闪烁。这是浪费;我们可以做得更好。

  2. Vim 的部署并不像下面的替代方案那么广泛,我们至少使用了 Vim 的三个功能,这些功能不太可能存在于更传统的 Vi 风格中,例如伯克利分校或者索拉里斯vi:正则\d表达式中的反向引用和多个-c标志。

  3. 因为 Vim 不适合解决此类问题,所以我们需要此处显式的“保存并退出”选项 ( -c wq),下面的替代方案更简要地表达了该选项。

更高效、更便携的选择是使用sed

$ sed -i -e 's/^\(VARIABLE=\)[0-9][0-9]*/\13/' The_Generator.c

如果您使用的系统可以使用POSIX 扩展正则表达式sedvia中-E,您可以使命令比 Vim 等效命令更短:

$ sed -E -i -e 's/^(VARIABLE=)[0-9]+/\13/' The_Generator.c

这让我们可以删除几个反斜杠并更紧凑地表达“一个或多个数字”。

如果效率不是最重要的,您可以通过以下方式获得更强的表现力Perl 派习惯用法

$ perl -pi -e 's/^(VARIABLE=)\d+/${1}3/' The_Generator.c

它比sed -E替代方案更短,因为 Perl 正则表达式比 POSIX 扩展 RE 更强大。

这里最大的区别在于 Perl 处理反向引用的方式。您通常将它们作为$NUM语法而不是给出\DIGIT,但我们将数字放在大括号中,以将其与替换文本分开,因为它也是一个数字。如果没有方括号,Perl 将寻找反向引用 #13,找不到匹配的文本,因此无法执行您想要的操作。

有些人喜欢 Awk 来做这类事情,但我无法想出一种比该sed选项短而比 Perl 选项更快的表达式。

相关内容