Answers:
2件事:
-o
选项,因此仅打印匹配项(而不是整行)-P
选择使用Perl正则表达式,该表达式包含有用的元素,例如向前看 (?= )
和向后看 (?<= )
,这些元素寻找零件,但实际上并不匹配并打印它们。如果只希望匹配parensis中的部分:
grep -oP '(?<=\/\()\w(?=\).+\/)' myfile.txt
如果文件包含字符串/(a)5667/
,则grep将显示'a',因为:
/(
由找到\/\(
,但由于它们位于后面 (?<= )
,因此未报告a
被匹配并被\w
打印(由于-o
))5667/
被发现b < \).+\/
,但是由于它们处于超前状态 (?= )
,因此不会报告使用中的-o
选项grep
。
例如:
$ echo "foobarbaz" | grep -o 'b[aeiou]r'
bar
如果只需要括号中的内容,则需要支持捕获子匹配项(命名或编号的捕获组)的内容。我认为grep或egrep不能做到这一点,perl和sed可以做到。例如,使用perl:
如果一个名为foo的文件中有一行,则如下所示:
/adsdds /
你也是:
perl -nle 'print $1 if /\/(\w).+\//' foo
返回字母a。那可能不是您想要的。如果您告诉我们您要匹配的内容,则可能会获得更好的帮助。$ 1是在第一组括号中捕获的内容。$ 2将是第二组,以此类推。
因为除了shell之外,您还将问题标记为bash,所以grep之外还有另一种解决方案:
Bash自3.0版以来就有自己的正则表达式引擎,使用的=~
运算符与Perl一样。
现在,给出以下代码:
#!/bin/bash
DATA="test <Lane>8</Lane>"
if [[ "$DATA" =~ \<Lane\>([[:digit:]]+)\<\/Lane\> ]]; then
echo $BASH_REMATCH
echo ${BASH_REMATCH[1]}
fi
bash
而不仅仅是sh
为了获得所有扩展名。$BASH_REMATCH
将给出与整个正则表达式匹配的整个字符串,因此 <Lane>8</Lane>
${BASH_REMATCH[1]}
将给出与第一组匹配的部分,因此仅 8
>
符号用于完全不同的目的)的可怕组合,这是由SANSparallel快速大规模对准软件产生的。当然,这两种格式都是隔行扫描而没有任何转义。因此,不可能在此处抛出一些标准XML库。在代码的这一点上,我正在使用Bash regex,因为我只需要提取几个数据,而2个regex对我来说比为这种混乱编写专用的解析器做得更好。#LifeInBioinformatics
假设文件包含:
$ cat file
Text-here>xyz</more text
并且您想要介于>
和之间的字符</
,可以使用以下任一方法:
grep grep -oP '.*\K(?<=>)\w+(?=<\/)' file
sed sed -nE 's:^.*>(\w+)</.*$:\1:p' file
awk awk '{print(gensub("^.*>(\\w+)</.*$","\\1","g"))}' file
perl perl -nle 'print $1 if />(\w+)<\//' file
全部将打印字符串“ xyz”。
如果要捕获此行的数字:
$ cat file
Text-<here>1234</text>-ends
grep grep -oP '.*\K(?<=>)[0-9]+(?=<\/)' file
sed sed -E 's:^.*>([0-9]+)</.*$:\1:' file
awk awk '{print(gensub(".*>([0-9]+)</.*","\\1","g"))}' file
perl perl -nle 'print $1 if />([0-9]+)<\//' file
sed
尝试使用后向引用来做到这一点?