这些不同的语法是什么意思?

时间:2011-09-01 00:59:38

标签: perl parsing sed

我正在试图找出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在打印行中引用了什么?

这很难在网上找到,如果有人能指引我正确的方向,我会很感激。

2 个答案:

答案 0 :(得分:4)

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

Perl脚本基本上是perl -00 -ne '/(re)g(ex)/ && print "re ex\n"',带有一个大的正则表达式,而不是我放在这里的简单占位符。特别是,/x修饰符允许您将正则表达式分成几行。因此,第一个/是正则表达式的开头,最后的/是正则表达式的结尾,其间的行一起形成正则表达式。

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

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

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

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

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

答案 1 :(得分:1)

让我们看看......

  1. 是的,sed将使用EOR:
  2. 清空这些行
  3. Perl脚本中的第一个/表示正则表达式模式。具体而言,它正在搜索下面表格中的模式
  4. 正则表达式以“xs”结尾,这意味着正则表达式将匹配输入的多行
  5. 该脚本还将输出标签中的字符串作为输出(见下文)。 $1$2表示第一对括号($1)和第二对括号($2)中包含的元素。
  6. 。表格就是这个:

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

    在这种情况下,$1<string1>$2<string2>