我需要从命令行更改存储在文本文件中的变量的数值。
我曾尝试使用 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
反向引用。
这里有几个弱点使得这不是最理想的:
对于像这样的简单任务来说,Vim 是一个相当繁重的程序。请注意,执行此操作时,您会看到全屏
vi
界面的短暂闪烁。这是浪费;我们可以做得更好。Vim 的部署并不像下面的替代方案那么广泛,我们至少使用了 Vim 的三个功能,这些功能不太可能存在于更传统的 Vi 风格中,例如伯克利分校或者索拉里斯
vi
:正则\d
表达式中的反向引用和多个-c
标志。因为 Vim 不适合解决此类问题,所以我们需要此处显式的“保存并退出”选项 (
-c wq
),下面的替代方案更简要地表达了该选项。
更高效、更便携的选择是使用sed
:
$ sed -i -e 's/^\(VARIABLE=\)[0-9][0-9]*/\13/' The_Generator.c
如果您使用的系统可以使用POSIX 扩展正则表达式在sed
via中-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 选项更快的表达式。