带引号的Perl命令行正则表达式

时间:2015-03-12 10:09:48

标签: regex perl command line quotation-marks

我有许多包含此类行的txt(* .log)文件:

...

不匹配'9:132170673':f [G,T] = [0.32,0.68]

不匹配'9:132228706':f [C,T] = [0.27,0.73]

'9:132280822'的可能链翻转:f [C,G,T] = [0.16,0.00,0.84]

...

我正在尝试提取字符串编号:引号之间的数字。来自命令行!

我可以使用脚本来管理它,但是想要了解如何从命令行执行此操作。 必须有一个简单的方法!

我一直在尝试明显的解决方案,例如:

  1. perl -ne 'if (/Possible/ or /Mismatch/) {/'(\S+)'/ ;print "$1\n";}' *.log

  2. perl -ne 'if (/Possible/ or /Mismatch/) {/\'(\S+)\'/ ;print "$1\n";}' *.log

  3. 两者都从UNIX获得这个答案:

      

    -bash:意外令牌附近的语法错误`('

    我也尝试拆分/'/ -F选项得到了同样的错误。

    如何在命令行内部转义?

4 个答案:

答案 0 :(得分:1)

将您的代码放在双引号内。如果您的代码中出现",则只将该部分放在单引号内。

$ perl -ne "if (m/Possible|Mismatch/) {/'(\S+)\'/ ;print "'"$1\n";}' file
9:132170673
9:132228706
9:132280822

OR

perl -ne "if(/Possible/ or /Mismatch/) {/'([^']+)'/ ;print "'"$1\n";}' file

答案 1 :(得分:1)

当bash正在评估单引号时,我只是简单地创建了三个字符串,第一个字符串在/之后结束,然后添加一个转义单引号并继续使用最后一部分。通过这种方式,字符串通过bash粘合在一起,Perl获得了正确的输入。

perl -ne 'if (/Possible/ or /Mismatch/) {/'\''(\S+)'\''/ ;print "$1\n";}' *.txt

答案 2 :(得分:1)

我会这样做:

perl -nE '/\b(?:Mismatched|Possible)\b.*?'\''(\S+)'\''/ and say $1'  in1.txt

<强>输出:

9:132170673
9:132228706
9:132280822

答案 3 :(得分:1)

我发现对全部或部分脚本参数使用双引号会有问题 - 尤其是当您需要在脚本中包含$!时。

另一种方法是使用单引号字符位于ASCII / Unicode图表中的代码点编号27(十六进制)的事实。在Perl字符串或正则表达式中,您可以将其称为\x27\x{27}

perl -ne 'if (/Possible/ or /Mismatch/) {/\x27(\S+)\x27/ ;print "$1\n";}' *.log

你可以使用一个命名变量来使事情变得更清楚,但这对于1-liner来说可能有点过分了:

perl -ne 'BEGIN { $apos = "\x27" } if (/Possible/ or /Mismatch/) {/$apos(\S+)$apos/ ;print "$1\n";}' *.log