删除从行首到特定字符的部分字符串



>我有一个包含 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/[^[]*[[]/[/'

剪裁所有且仅包含至少一个[的行

最新更新