[英]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。 从命令行!
我可以使用脚本来管理它,但想从命令行中了解如何进行操作。 一定有一个简单的方法!
我一直在尝试显而易见的解决方案,例如:
perl -ne 'if (/Possible/ or /Mismatch/) {/'(\\S+)'/ ;print "$1\\n";}' *.log
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.