【问题标题】:What do these various pieces of syntax mean?这些不同的语法是什么意思?
【发布时间】:2011-11-08 01:43:11
【问题描述】:

我正在尝试找出 sed 命令和 perl 脚本的语法:

sed 's/^EOR:$//' INPUTFILE |
perl -00 -ne '/
TAGA01:\s+(.*?)\n
.*
TAGCC08:\s+(.*?)\n
# and so on
/xs && print "$1 $2\n"'

为什么在 sed 命令中有一个抑扬符^?第三个斜线/ 会将EOR: 的所有实例替换为空行,对吗?

我了解一些 Perl 脚本。查看perlrun-00 将以段落模式啜饮流,-n 启动while <> 循环。

为什么在撇号旁边有第一个斜线/?该命令搜索TAGXXXX:,但我不确定\s+(.*?) 做了什么。这是否将标签之后的任何内容放入变量中?标签间搜索中的.* 怎么样? /ns 是做什么的?打印行中的$1$2 指的是什么?

这在网上很难找到,如果有人能把我踢向正确的方向,我将不胜感激。

【问题讨论】:

  • 我想如果不了解 Perl 真的很难弄清楚。如果你只是想知道这个脚本的作用,有些人可能会告诉你,但是你问的所有关于细节的问题......你必须通过一本好的 Perl 书自己学习。
  • “我正在尝试找出语法”你已经知道语法了!如果您想知道代码 的含义 是什么,那么您正在尝试找出 语义,而不是语法。

标签: perl parsing sed


【解决方案1】:

抑扬符^ 是“行首”的正则表达式,$ 是“行尾”的正则表达式;所以sed 只会删除包含完全“EOR:”的行,而不是其他行。

Perl 脚本基本上是perl -00 -ne '/(re)g(ex)/ && print "re ex\n"',带有一个大的 ole 正则表达式,而不是我放在这里的简单占位符。特别是,/x 修饰符允许您将正则表达式拆分为多行。所以第一个/ 是正则表达式的开头,最后一个/ 是正则表达式的结尾,中间的行共同构成了正则表达式。

/s 修饰符改变了 Perl 在正则表达式中解释 . 的方式;通常它将匹配除换行符以外的任何字符,但使用此选项,它也包括换行符。这意味着.* 可以匹配多行。

\s 匹配单个空白字符; \s+ 匹配尽可能多的空白字符,但必须至少有一个。

(.*?) 匹配任意长度的字符串;点匹配任何字符,星号表示零个或多个任何字符,问号修改星号重复运算符以匹配尽可能短的字符串,而不是尽可能长的字符串。括号导致跳过的表达式在反向引用中被捕获;反向引用命名为$1$2 等,与反向引用一样多;数字对应于左括号的顺序(因此,如果将(a(b)) 应用于字符串“ab”,$1 将是“ab”,$2 将是“b”)。

最后,\n 匹配文字换行符。所以(.*?) 非贪婪匹配将匹配第一个换行符,即找到 TAGsomething 的行的尾部。 (一世 想象这些是基因序列,而不是“标签”?)

单独运行sed 确实没有意义; Perl 可以在尝试匹配正则表达式之前删除 EOR: 行。

【讨论】:

    【解决方案2】:

    让我们看看...

    1. 是的,sed 将清空带有EOR: 的行
    2. Perl 脚本中的第一个/ 表示正则表达式模式。具体来说,它正在寻找如下形式的模式
    3. 正则表达式以“xs”结尾,表示该正则表达式将匹配输入的多行
    4. 该脚本还将打印在标签中找到的字符串作为输出(见下文)。 $1$2 表示第一对括号 ($1) 和第二对括号 ($2) 中包含的元素。

    。表格是这样的:

    TAGA01:<spaces><string1>
    <whatever here>
    TAGCC00:<spaces><string2>
    

    在这种情况下,$1&lt;string1&gt;$2&lt;string2&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 2012-07-25
      • 2011-11-13
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多