【问题标题】:what does this perl -ane mean in the find command of shell script?这个 perl -ane 在 shell 脚本的 find 命令中是什么意思?
【发布时间】:2022-01-20 16:31:44
【问题描述】:

我有这个查找脚本

Find $DATA/ -mindepth 1 -maxdepth 1 |\
perl -ane ' s:.*/((.+)\-[0-9]{8,10}[a-z]*([_\-].*)?):$2: && print; ' | \
sort -u > $loctmp/speakers_all.txt

任何shell脚本上帝可以为我解码吗? perl -ane 命令在做什么?

【问题讨论】:

  • 至于“内联脚本”(' ' 之间的所有内容)的作用,它运行一个正则表达式,匹配该行中的某个模式并将其替换为其中的一部分;所以它重写了这一行。然后将其打印出来并将所有这些行发送到排序。
  • 请注意,这里没有任何东西可以证明特别使用 perl 是合理的。由于所有量词都是贪婪的,因此使用sed -nE 's#.*/(.+)-[0-9]{8,10}[a-z]*([_-].*)?#\1#p' 可以更快地获得相同的结果

标签: shell perl


【解决方案1】:

perl -n 表示“遍历输入行,但不要打印它们。”

perl -a 表示像 awk 中那样将输入行分开,但在这里看起来没有必要。

perl -e 说“这个参数是要运行的程序”。

运行 perldoc perlrun 以了解有关 Perl 命令行用法的更多信息。

【讨论】:

  • 文档也可用online
  • 非常感谢@andy isr
  • Re "我认为这里不需要 [-a]",正确。它填充@F,程序不使用它。 /// Re "Iterate over the input lines", 更清楚:对每一行输入执行程序。 (该行位于$_。)
  • 我们可以确切地看到 perl 将要做什么,我将 -MO=Deparse 添加到选项中:perl -MO=Deparse -ane ' s:.*/((.+)\-[0-9]{8,10}[a-z]*([_\-].*)?):$2: && print; ' 吐出代码 perl 将运行。
【解决方案2】:
perl -ane ' s:.*/((.+)\-[0-9]{8,10}[a-z]*([_\-].*)?):$2: && print; ' 

Perl 的命令开关,见perl -h:

-a                autosplit mode with -n or -p (splits $_ into @F)
-n                assume "while (<>) { ... }" loop around program

不使用自动拆分,可以安全移除。

-e 只是表示要运行的代码在哪里。也可以替换为包含代码的文件。例如。 perl foo.pl.

代码本身只是一个正则表达式替换。如果展开,代码如下所示:

while (<>) {
    s:.*/((.+)\-[0-9]{8,10}[a-z]*([_\-].*)?):$2: && print; 
}
  • while (&lt;&gt;) 循环输入,将每一行放入默认变量 $_
  • s:... 是替换运算符,但默认分隔符 / 已替换为冒号 :。通常这样做是为了避免在正则表达式中转义分隔符。
  • 正则表达式本身匹配任何字符.,0 次或多次*,后跟斜杠/(可能是更改分隔符的原因)。然后是由任意字符 1 次或多次 .+ 组成的字符串,捕获到 ()。然后是破折号\-,后跟 8 到 10 位数字 0-9,后跟字符 a-z 0 次或更多次。然后它捕获由_- 组成的字符串,后跟任何字符. 0 次或更多次。 ? 也将此捕获设为可选,这意味着它可以匹配 0 次或 1 次。如果有匹配,它将被$2 中捕获的任何内容替换。捕获$2 是第一部分,在斜线(.+) 之前,据我所知。
  • &amp;&amp; 表示仅在 LHS 为真时才执行 RHS。 IE。仅在正则表达式匹配时打印。
  • printprint $_ 相同。

简而言之,代码将提取最后一个斜杠和 8 到 10 位数字之间的部分,并丢弃字符串中的其他所有内容。除了可选匹配之外,这意味着可以保留 8-10 位数字之后的字符串,如果它的开头有下划线或破折号。然后打印。

【讨论】:

  • “并丢弃字符串中的所有其他内容”,并非总是如此。如果在数字和最终字母之后没有下划线或连字符,则字符串的结尾保留。 ([_-].*)? 是可选的。
  • @CasimiretHippolyte 这是真的。这是一个奇怪的正则表达式,不知道这部分是否是故意的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 2018-10-17
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
相关资源
最近更新 更多