1

我有许多包含此类行的 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 选项拆分 /'/ 得到相同的错误。

如何在命令行中转义 '?

4

4 回答 4

1

我会做:

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

输出:

9:132170673
9:132228706
9:132280822
于 2015-03-12T10:34:30.620 回答
1

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

$ 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
于 2015-03-12T10:18:59.060 回答
1

由于 bash 正在评估单引号,我只是从中创建了三个字符串,第一个字符串以 . 结尾/,然后添加一个转义单引号并继续最后一部分。通过这种方式,字符串被 bash 粘合在一起,Perl 得到正确的输入。

perl -ne 'if (/Possible/ or /Mismatch/) {/'\''(\S+)'\''/ ;print "$1\n";}' *.txt
于 2015-03-12T10:24:56.797 回答
1

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

另一种方法是使用单引号字符位于 ASCII/Unicode 图表中的代码点编号 27(十六进制)的事实。在 Perl 字符串或正则表达式中,您可以将其称为\x27or \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
于 2015-03-12T20:42:40.090 回答