从行的开头删除部分字符串到某个字符

时间:2016-12-10 20:41:07

标签: bash awk sed

我有一个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,但无法将其与行的开头匹配。

7 个答案:

答案 0 :(得分:6)

用sed进行简单的替换:

sed 's/^[^[]*\[/[/' input

^表示开始使用模式空间("第"行),[^[]匹配除[之外的所有内容。 *是一个量词,表示零次或多次。 \[是文字[

答案 1 :(得分:4)

使用sed:

sed 's/^[^[]*//' file

缺点:如果某行不包含[,则sed会输出一个空行。

答案 2 :(得分:2)

一个简单的sed解决方案,假设每行最多只有一个[

 sed 's/.*\[/[/' file
  • 单个 - [假设允许更容易理解的“嘈杂”正则表达式:

    • s是Sed的字符串替换函数,其参数在此处使用习惯(但可选择)/分隔符分隔。
    • 第一个参数,正则表达式.*\[,匹配该行上 last [的任何行的开头(文字[必须表示为\[,因为[在正则表达式中具有特殊含义。)
    • 第二个参数[是替换字符串([ 需要在替换字符串参数中转义,因为它本身不是正则表达式)。
  • 由于sed正则表达式总是贪婪,.*\[会匹配每行上 last [的所有内容。

    < / LI>
  • 相比之下,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/[^[]*[[]/[/'

剪辑所有内容并且仅包含至少包含[

的行