在命令行中使用Perl:perl -p -i -e“某些文本” / path

时间:2019-10-02 12:37:10

标签: perl command-line

我对perl不熟悉。我正在阅读安装指南atm,并且出现了以下Linux命令:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

现在,我正在试图理解这一点。到目前为止,这是我的理解:

-e仅允许执行以下操作

-p使我跟随-e的命令循环。现在这对我来说很奇怪,因为对我来说,该命令似乎试图说:在/ etc / selinux / config中写入“ s / enforcing / disabled /”。再说一遍,“写”命令在哪里? -i(内联)有什么用?

2 个答案:

答案 0 :(得分:4)

-p更改

s/enforcing/disabled/

等同于

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

简写

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

这是什么:

  1. 它从ARGV$_读一行。 ARGV是一个特殊的文件句柄,它从指定为参数的每个文件中读取(如果没有提供文件,则从STDIN中读取)。
  2. 如果已达到EOF,则循环将退出,因此程序将退出。
  3. 它将enforcing的第一个匹配项替换为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版本中,这会写入临时文件,该文件随后将覆盖程序正在读取的文件。

答案 1 :(得分:1)

要准确了解 Perl的功能,可以使用the O module

perl -MO=Deparse -p -i -e "s/enforcing/disabled/" file

输出

BEGIN { $^I = ""; }
LINE: while (defined($_ = readline ARGV)) {
    s/enforcing/disabled/;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK