【问题标题】:Replacing special character by new line用新行替换特殊字符
【发布时间】:2020-02-13 20:33:50
【问题描述】:

我在一个文本文件中有以下几行。我想删除最后一个 '_' 并在之后添加一个换行符。

>15_48499991_ENSG00000074803_C_G_G_CCAATCGCTTTCAAGTTAGTGTG
>15_48499991_ENSG00000074803_C_G_G_CAATCGCTTTCAAGTTAGTGTGA
>15_48499991_ENSG00000074803_C_G_G_AATCGCTTTCAAGTTAGTGTGAT

Desired output:

>15_48499991_ENSG00000074803_C_G_G
CCAATCGCTTTCAAGTTAGTGTG
>15_48499991_ENSG00000074803_C_G_G
CAATCGCTTTCAAGTTAGTGTGA
>15_48499991_ENSG00000074803_C_G_G
AATCGCTTTCAAGTTAGTGTGAT

我使用下面的 SED 查询来执行此操作。我无法找出查询中的问题。

sed 's/\_/'\n'/g'

【问题讨论】:

  • 单引号不能嵌套。
  • 如果您的 sed\n 替换部分中的换行符有问题,只需在此处键入文字换行符,或使用变量(但然后在 sed 命令周围使用双引号)。匹配最后一个_ 也可以使用_([^_]*)$ POSIX ERE 完成。

标签: regex sed substitution


【解决方案1】:

在匹配_ 之前,您可以让.* 尽可能多地吃掉这条线(因为* 是贪婪的):

sed 's/\(.*\)_/\1\n/' file

或者更好的有争议的

sed -E 's/(.*)_/\1\n/' file

关于您的尝试,它有 3 个错误:

  • _ 不需要转义
  • ' 不能嵌套(这是因为 shell,而不是 sed);首先,我不明白你为什么把它们放在那里:你想做什么?
  • 如果您修复了上述两个问题,以 sed 's/_/\n/g' 结尾,您将替换所有 _s,而不仅仅是最后一个。

【讨论】:

  • 哦,@rshar,这是接受我的回答的好理由,不是吗?此外,第一个和第二个命令做同样的事情。后者通过使用扩展正则表达式的-E 选项去掉了一些反斜杠。
猜你喜欢
  • 1970-01-01
  • 2014-11-03
  • 2019-09-23
  • 1970-01-01
  • 2023-03-31
  • 2011-12-28
  • 1970-01-01
相关资源
最近更新 更多