>我有一个包含 10000 行的文件,如下所示:
Peptidyl-prolyl cis-trans isomerase A OS=Homo sapiens GN=PPIA PE=1 SV=2 - [PPIA] 0.8622399654 3.2730004556
我不知道如何将部分字符串删除到方括号,以便最终输出如下所示:
[PPIA] 0.8622399654 3.2730004556
到目前为止,我尝试了python re.sub,但无法将其与行首匹配。
使用 sed 是一个简单的替换:
sed 's/^[^[]*[/[/' input
^
表示模式空间("线")的开始,[^[]
匹配除[
以外的所有内容。*
是一个量词,表示零次或多次。[
是一个字面上的[
。
使用 sed:
sed 's/^[^[]*//' file
缺点:如果一行不包含[
,sed 会输出一个空行。
你真的不想拥有最后两个字段吗?
awk '{print $(NF-1), $NF}' file
否则
awk -F'] ' '{print $2}' file
(请注意,这也会删除]
后面的空格)
Python解决方案(通过使用bytearray.find(sub[, start[, end]])
函数):
line = 'Peptidyl-prolyl cis-trans isomerase A OS=Homo sapiens GN=PPIA PE=1 SV=2 - [PPIA] 0.8622399654 3.2730004556'
replaced = line[max(line.find('['), 0):]
print(replaced)
输出:
[PPIA] 0.8622399654 3.2730004556
p.s.如果字符串中没有出现[
- 结果将是一个完整的初始字符串
一个简单的sed
解决方案,假设每行最多有一个[
:
sed 's/.*[/[/' file
做出单
[
假设允许一个更容易理解的"嘈杂"正则表达式:s
是 Sed 的字符串替换函数,其参数在此处用习惯(但可选)/
分隔符分隔。- 第一个参数,正则表达式
.*[
,匹配任何行的开头,直到该行的最后一[
(文字[
必须表示为[
,因为它在正则表达式中具有特殊含义[
)。 - 第二个参数
[
是替换字符串([
不需要在替换字符串参数中进行转义,因为它本身不是正则表达式)。
由于
sed
正则表达式总是贪婪的,因此.*[
将所有内容匹配到每行的最后一[
。相比之下,andlrc 有用答案中的正则表达式更复杂,但可以预见的是,它只匹配第一个
[
(如果有的话)。
在这种情况下,perl
提供了两全其美的解决方案:一个强大的、只有第一[
的解决方案,仍然具有合理的可读性:
perl -pe 's/.*?[/[/' file
请注意*?
量词,它使匹配不贪婪。
像这样:
line = line[line.index('['):]
如果所有行都包含[
.
更健壮一点:
for line in open('myfilename..'):
if '[' in line:
print line[line.index('['):]
else:
print line
管道进入 sed:
sed 's/[^[]*[[]/[/'
剪裁所有且仅包含至少一个[
的行