【问题标题】:Inserting text to make every row start the same way插入文本以使每一行以相同的方式开始
【发布时间】:2021-10-20 15:25:53
【问题描述】:

我有一个文件,其中包含包含各种信息的行。不幸的是,该文件是从许多不同的来源编译的,因此某些行比其他行包含更多信息:

1_10090 Mus musculus (house mouse) Gene 1
2_10090 Mus musculus Gene 2
3_10090 (house mouse) Gene 3
4_10090 Gene 4

我想要的输出是:

1_10090 Mus musculus (house mouse) Gene 1
2_10090 Mus musculus (house mouse) Gene 2
3_10090 Mus musculus (house mouse) Gene 3
4_10090 Mus musculus (house mouse) Gene 4

我想使用 sed 将包含 _10090 后跟除“M”以外的字符的每一行替换为“Mus musculus”(然后对不包含(家鼠)的行执行相同操作):

sed 's/_10090 [^M]/_10090 Mus musculus /g'

但这当然会替换我想要保留的 10090 之后的字符:

1_10090 Mus musculus (house mouse) Gene 1
2_10090 Mus musculus Gene 2
3_10090 Mus musculus house mouse) Gene 3
4_10090 Mus musculus ene 4

我该如何确保每一行都以

开头
#_10090 Mus musculus (house mouse)

每行之间的#是不同的,有些行已经包含这个字符串,而其他行包含它的一部分?

提前致谢!

【问题讨论】:

  • (house mouse)是固定字符串吗,还是(...)里面有什么东西?
  • 请检查ideone.com/52hZt6 是否适合您。
  • @WiktorStribiżew(家鼠)是一个固定字符串。唯一不同的是出现在 _10090 之前的字符和出现在(鼠标)之后的字符
  • @WiktorStribiżew 我试过了,我认为成功了!非常感谢!
  • 我在下面的答案中添加了方法说明。

标签: string sed replace row


【解决方案1】:

你可以使用

sed -E 's/_10090( Mus musculus)?( \(house mouse\))? /_10090 Mus musculus (house mouse) /g' file

该方法略有不同,因为您描述的逻辑无助于实现预期结果。也就是说,我匹配一个可选的' Mus musculus',然后在_10090 子字符串之后匹配一个可选的' (house mouse)' 子字符串(后面有一个空格),并在替换模式中添加(返回,如果它们存在)这些子字符串。

查看online demo

#!/bin/bash
s='1_10090 Mus musculus (house mouse) Gene 1
2_10090 Mus musculus Gene 2
3_10090 (house mouse) Gene 3
4_10090 Gene 4'
sed -E 's/_10090( Mus musculus)?( \(house mouse\))? /_10090 Mus musculus (house mouse) /g' <<< "$s"

输出:

1_10090 Mus musculus (house mouse) Gene 1
2_10090 Mus musculus (house mouse) Gene 2
3_10090 Mus musculus (house mouse) Gene 3
4_10090 Mus musculus (house mouse) Gene 4

【讨论】:

    猜你喜欢
    • 2016-09-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多