首页 > 解决方案 > 命令行中的 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 (内联)有什么用?

标签: perlcommand-line

解决方案


-p变化

s/enforcing/disabled/

相当于

while (<>) {
   s/enforcing/disabled/;
   print;
}

这是缩写

while (defined( $_ = <ARGV> )) {
   $_ =~ s/enforcing/disabled/;
   print($_);
}

这是做什么的:

  1. ARGV它从into读取一行$_ARGV是一个特殊的文件句柄,它从指定为参数的每个文件中读取(如果没有提供文件,则为 STDIN)。
  2. 如果已达到 EOF,则循环并因此程序退出。
  3. 它取代了第一次出现的enforcingwith disabled
  4. 它将修改后的行打印到默认输出句柄。因为-i,这是一个新文件的句柄,它与程序当前正在读取的文件同名。*
  5. 重复。

例如,

$ 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 版本中,这会写入临时文件,该文件稍后会覆盖程序正在读取的文件。


推荐阅读