我有一个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,但无法将其与行的开头匹配。
答案 0 :(得分:6)
用sed进行简单的替换:
sed 's/^[^[]*\[/[/' input
^
表示开始使用模式空间("第"行),[^[]
匹配除[
之外的所有内容。 *
是一个量词,表示零次或多次。 \[
是文字[
。
答案 1 :(得分:4)
使用sed:
sed 's/^[^[]*//' file
缺点:如果某行不包含[
,则sed会输出一个空行。
答案 2 :(得分:2)
一个简单的sed
解决方案,假设每行最多只有一个[
:
sed 's/.*\[/[/' file
单个 - [
假设允许更容易理解的“嘈杂”正则表达式:
s
是Sed的字符串替换函数,其参数在此处使用习惯(但可选择)/
分隔符分隔。.*\[
,匹配该行上 last [
的任何行的开头(文字[
必须表示为\[
,因为[
在正则表达式中具有特殊含义。)[
是替换字符串([
不需要在替换字符串参数中转义,因为它本身不是正则表达式)。 由于sed
正则表达式总是贪婪,.*\[
会匹配每行上 last [
的所有内容。
相比之下,andlrc's helpful answer中的正则表达式更复杂,但可预见的是只匹配 first [
(如果有的话)。
perl
提供了两全其美的优势:一个强大的第一个 - [
- 唯一仍然相当可读的解决方案:
perl -pe 's/.*?\[/[/' file
注意*?
量词,它使匹配的非贪婪。
答案 3 :(得分:2)
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。如果[
在字符串中没有出现 - 结果将是一个完整的初始字符串
答案 4 :(得分:2)
难道你真的不想拥有最后两个字段吗?
awk '{print $(NF-1), $NF}' file
否则,
awk -F'] ' '{print $2}' file
(请注意,这也会删除]
)
答案 5 :(得分:1)
类似的东西:
line = line[line.index('['):]
如果所有行都包含[
。
更强大一点:
for line in open('myfilename..'):
if '[' in line:
print line[line.index('['):]
else:
print line
答案 6 :(得分:1)
进入sed:
sed 's/[^[]*[[]/[/'
剪辑所有内容并且仅包含至少包含[