我有许多包含此类行的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]
...
我正在尝试提取字符串编号:引号之间的数字。来自命令行!
我可以使用脚本来管理它,但是想要了解如何从命令行执行此操作。 必须有一个简单的方法!
我一直在尝试明显的解决方案,例如:
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选项得到了同样的错误。
如何在命令行内部转义?
答案 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