我想使用 sed 更改一堆类似脚本中的一行。其中一些脚本实际上并不包含我想要更改的行。但是, sed 并没有告诉我它没有改变行,因为它不存在。关于如何让 sed 发出警告的任何想法?说,我有脚本一
log export ALBET=0.155
log export ALBEG=0.218
log export RADGHGCOEF=1.0
Run Code Online (Sandbox Code Playgroud)
和脚本二
log export ALBET=0.168
log export ALBEG=0.201
Run Code Online (Sandbox Code Playgroud)
然后
sed -i 's/RADGHGCOEF=.*/RADGHGCOEF=2.0/' script
Run Code Online (Sandbox Code Playgroud)
对它们都适用,但我想知道在脚本 2 中实际上没有包含 RADGHGCOEF 的行要更改。谢谢!
使用这个 Perl 单行:
perl -i -pe '$found++ if s/RADGHGCOEF=.*/RADGHGCOEF=2.0/; END { warn "$ARGV: not found\n" if !$found; }' script
Run Code Online (Sandbox Code Playgroud)
Perl 单行使用这些命令行标志:
-e: 告诉 Perl 查找内嵌代码,而不是在文件中。
-p: 一次循环输入一行,$_默认分配给它。print $_在每次循环迭代后添加。
-i:就地编辑输入文件(覆盖输入文件)。
$ARGV : 当前输入文件名。
$found++ if s/.../.../: 将$found变量从其undef初始值增加 1 ,使其现在变为 1(或更多,取决于替换发生的次数)。
END { ... }: 读取整个输入文件后执行代码。
if !$found: 如果替换从未发生,$found则false在布尔上下文中),否则true.
也可以看看:
perldoc perlrun:如何执行 Perl 解释器:命令行开关
perldoc perlvar:Perl 预定义变量