perl - 命令行中的 Perl: perl -p -i -e "some text" /path
问题描述
我不熟悉perl。我正在阅读安装指南 atm 并且出现了以下 Linux 命令:
perl -p -i -e "s/enforcing/disabled/" /etc/selinux/config
现在,我试图理解这一点。到目前为止,这是我的理解:
-e 只允许执行以下任何内容
-p 将我跟在 -e 之后的命令放在一个循环中。现在这对我来说很奇怪,因为对我来说这个命令似乎是想说:将“s/enforcing/disabled/”写入/etc/selinux/config。再说一次,“写”命令在哪里?这 -i (内联)有什么用?
解决方案
-p
变化
s/enforcing/disabled/
相当于
while (<>) {
s/enforcing/disabled/;
print;
}
这是缩写
while (defined( $_ = <ARGV> )) {
$_ =~ s/enforcing/disabled/;
print($_);
}
这是做什么的:
ARGV
它从into读取一行$_
。ARGV
是一个特殊的文件句柄,它从指定为参数的每个文件中读取(如果没有提供文件,则为 STDIN)。- 如果已达到 EOF,则循环并因此程序退出。
- 它取代了第一次出现的
enforcing
withdisabled
。 - 它将修改后的行打印到默认输出句柄。因为
-i
,这是一个新文件的句柄,它与程序当前正在读取的文件同名。* - 重复。
例如,
$ cat a
foo
bar enforcing the law
baz
enforcing enforcing
$ perl -pe's/enforcing/disabled/' -i a
$ cat a
foo
bar disabled the law
baz
disabled enforcing
* — 在旧版本的 Perl 中,此时旧文件已被删除,但只要有打开的文件句柄,它仍然可以访问。在非常新的 Perl 版本中,这会写入临时文件,该文件稍后会覆盖程序正在读取的文件。
推荐阅读
- ruby-on-rails - Factory_bot ActiveRecord::RecordInvalid
- java - 按属性对 JSON 输出进行分组
- python - python的List和CSV阅读器
- generics - 使用 javassist 创建方法时,如何分配泛型类 int 方法返回类型?
- python - 查找被换行符打断的长单词
- sqlite - 如何在反应博览会中显示数据库中的图像
- regex - 如何在 Excel 中使用 VBA RegExp(或其他函数)来转义特殊字符?
- html - 如何在另一个之上使用字体可怕的图标
- php - 如何在新订单电子邮件中更改 WooCommerce Shipping 字段?
- python-3.x - 如何在 python 中读取大小为 4 GB 的 JSON 文件?