2011-09-01 59 views
1

我试图找出这两个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,-00slurp段落模式下的流和-n开始while <>循环。

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

这很难在网上找到,如果有人可以把我踢向正确的方向,我会很感激。

+1

我想在不了解Perl的情况下很难弄清楚。如果你只是想知道这个脚本是做什么的,有些人可以告诉你,但是你所提到的所有关于细节的问题......你必须用一本好的Perl书为你自己学习。 –

+1

“我试图找出语法”你已经知道语法!如果你想知道什么代码*意味着*,那么你试图找出*语义*,而不是语法。 – tadmc

回答

4

这个音符^是“start of line”的正则表达式,$是“end of line”的正则表达式;因此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的行的尾部。 (I 想象这些是基因序列,而不是“标签”?)

单独运行sed没有什么意义,在尝试匹配正则表达式之前,Perl将非常有能力去除EOR:行。

1

让我们来看看...

  1. 是,sed将空线,EOR:
  2. 在Perl脚本的第一/意味着正规表达式模式。具体而言,它正在搜索的形式下面
  3. 正则表达式的图案以“XS”结尾,这意味着该正则表达式匹配的输入的多行
  4. 脚本还将打印作为输出在所找到的字符串标签(见下文)。 $1$2表示包含在第一对括号($1)和第二对($2)中的元素。

。的形式是这样的一种:

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

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