繁体   English   中英

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

[英]Perl command line regex with quotation mark

我有许多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]

...

我正在尝试提取引号之间的字符串number:number。 从命令行!

我可以使用脚本来管理它,但想从命令行中了解如何进行操作。 一定有一个简单的方法!

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

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

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

两者都从UNIX获得以下答案:

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

我还尝试使用-F选项在/'/上拆分,得到相同的错误。

如何在命令行中转义'?

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

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

要么

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

当bash评估单引号时,我简单地用它做成了三个字符串,第一个以/结束,然后添加一个转义的单引号并继续最后一部分。 这样,通过bash将字符串粘合在一起,Perl将获得正确的输入。

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

我会做:

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

输出:

9:132170673
9:132228706
9:132280822

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

另一种方法是利用单引号字符位于ASCII / Unicode图表中的代码点编号27(hex)的事实。 在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM