【问题标题】:How to add newline return after regex search before and after the regex pattern?如何在正则表达式模式之前和之后在正则表达式搜索后添加换行符?
【发布时间】:2018-04-24 03:06:33
【问题描述】:

我有一个包含一些 DNA 序列的文本文件。它在一行上,但我想将它分成多行。

>JH739887TTTACAATGTATAATAGAAACTAAAACTGAAATGTTAATCTTGAAATTTAAGAATCTTCAAAAATGTTTAAGTGGTGATAATCTCCCCAGTGTGAGAAACACACTTGGAAGGAAGTCACAAGTCAAATTTAGATTTGTTGCTTAATAATGGATTTGTAAGTATTATCAAATACTCAAGCACtaaggaaacaggaaaatctgaaatgttCACTTGCTTCTAAACATTTGCAGCCGAGTCCAACTTACACAGGGTAAGATGAGTTTTACAGACAGACACTATTTGTTATTAGGTCAGCTACAGTAAGTGAAAAAACTCACCTCTTTAAGTCTGATAAAGTAGCAGAAagtcatattttaaatatcagtaTAAACAAATGCTCTAAGTTTGGAAATGTTAATCTTGAAAGAACCTTCAAAAACATTTAAGTGCTGGTTATCTCCCCAGTGTGT>JH739882TTTACAATGTATAATAGAAACTAAAACTGAAATGTTAATCTTGAAATTTAAGAATCTTCAAAAATGTTTAAGTGGTGATAATCTCCCCAGTGTGAGAAACACACTTGGAAGGAAGTCACAAGTCAAATTTAGATTTGTTGCTTAATAATGGATTTGTAAGTATTATCAAATACTCAAGCACtaaggaaacaggaaaatctgaaatgttCACTTGCTTCTAAACATTTGCAGCCGAGTCCAACTTACACAGGGTAAGATGAGTTTTACAGACAGACACTATTTGTTATTAGGTCAGCTACAGTAAGTGAAAAAACTCACCTCTTTAAGTCTGATAAAGTAGCAGAAagtcatattttaaatatcagtaTAAACAAATGCTCTAAGTTTGGAAATGTTAATCTTGAAAGAACCTTCAAAAACATTTAAGTGCTGGTTATCTCCCCAGTGTGT

我可以看到我要分隔文件的地方:

grep '>[A-Z]\{2\}[0-9]\{6\}' ~/Desktop/text2.txt

正则表达式 ">[A-Z]{2}[0-9]{6}" 查找模式 ">JH######

但是每当我使用 sed 命令在正则表达式搜索之前和之后添加一行返回时,它都不起作用:

sed  '/>[A-Z]\{2\}[0-9]\{6\}/a/b\ 
\n' ~/Desktop/text2.txt

这是我遇到的错误:

sed: 1: "/>[A-Z]\{2\}[0-9]\{6\}/ ...": command a expects \ followed by text

下面的这个命令正在运行,但没有给出预期的结果:

sed  '/>[A-Z]\{2\}[0-9]\{6\}/a\ 
\n' ~/Desktop/text2.txt

这是我期望的结果(第一行之前不应该有返回,但是对于其余的比赛,他们应该在之前和之后有一个返回行,这里包含返回行¬清晰度):

>JH739887¬
TTTACAATGTATAATAGAAACTAAAACTGAAATGTTAATCTTGAAATTTAAGAATCTTCAAAAATGTTTAAGTGGTGATAATCTCCCCAGTGTGAGAAACACACTTGGAAGGAAGTCACAAGTCAAATTTAGATTTGTTGCTTAATAATGGATTTGTAAGTATTATCAAATACTCAAGCACtaaggaaacaggaaaatctgaaatgttCACTTGCTTCTAAACATTTGCAGCCGAGTCCAACTTACACAGGGTAAGATGAGTTTTACAGACAGACACTATTTGTTATTAGGTCAGCTACAGTAAGTGAAAAAACTCACCTCTTTAAGTCTGATAAAGTAGCAGAAagtcatattttaaatatcagtaTAAACAAATGCTCTAAGTTTGGAAATGTTAATCTTGAAAGAACCTTCAAAAACATTTAAGTGCTGGTTATCTCCCCAGTGTGT¬
>JH739882¬
TTTACAATGTATAATAGAAACTAAAACTGAAATGTTAATCTTGAAATTTAAGAATCTTCAAAAATGTTTAAGTGGTGATAATCTCCCCAGTGTGAGAAACACACTTGGAAGGAAGTCACAAGTCAAATTTAGATTTGTTGCTTAATAATGGATTTGTAAGTATTATCAAATACTCAAGCACtaaggaaacaggaaaatctgaaatgttCACTTGCTTCTAAACATTTGCAGCCGAGTCCAACTTACACAGGGTAAGATGAGTTTTACAGACAGACACTATTTGTTATTAGGTCAGCTACAGTAAGTGAAAAAACTCACCTCTTTAAGTCTGATAAAGTAGCAGAAagtcatattttaaatatcagtaTAAACAAATGCTCTAAGTTTGGAAATGTTAATCTTGAAAGAACCTTCAAAAACATTTAAGTGCTGGTTATCTCCCCAGTGTGT¬

【问题讨论】:

    标签: macos unix sed terminal


    【解决方案1】:

    试试这个:

    sed  's/>[A-Z]\{2\}[0-9]\{6\}/\n&\n/g;s/^\n//' file
    
    • s/>[A-Z]\{2\}[0-9]\{6\}/\n&\n/g:在每个匹配的字符串前后添加一个换行符
    • s/^\n//: 删除第一行添加的换行符

    【讨论】:

    • 它正在打印一些东西,但它没有添加行返回:n>JH739887nTTTA。这是我为前几个字符得到的结果
    • 您使用的是 Mac?
    • 是的,这有什么不同?它仅适用于 Linux 吗?
    • 真正快速的方法是安装 gnu-sed 并使用 gsed (brew install gnu-sed) superuser.com/questions/307165/newlines-in-sed-on-mac-os-x。用这个...
    • 替换字符串中的\n 字符不符合 POSIX,并且不适用于 FreeBSD sed。但是有一个解决方法,使用 ANSI-C 样式转义:sed 's/>[A-Z]\{2\}[0-9]\{6\}/\'$'\n&\'$'\n/g;s/^\'$'\n//'。另一种方法是像您一样安装 GNU sed...
    【解决方案2】:

    我讨厌 sed,但这是一个有趣的挑战:

    sed -nE '
      :loop
          s/./&/
          tcontinue
          bnext
    
      :continue
          h
          s/(^>[A-Z]{2}[0-9]{6}).*/\1/
          p
    
          g
          s/^>[A-Z]{2}[0-9]{6}//
    
          h
          s/>[A-Z]{2}[0-9]{6}.*//
          p
    
          g
          s/[^>]+//
          tloop
      :next
    ' file
    

    这是一个这样有趣的挑战,理解这个程序留给读者作为练习。

    【讨论】:

      【解决方案3】:

      使用 GNU grep,您可以编写

      grep -oP '>[A-Z]{2}\d{6}|(?<=>.{8})[^>]+' file
      

      但您的 Mac 上可能没有 GNU grep。试试普通的 perl

      perl -pe 'chomp; s/(>[A-Z]{2}\d{6})([^>]+)/$1\n$2\n/g' file
      

      【讨论】:

        猜你喜欢
        • 2018-01-17
        • 1970-01-01
        • 2018-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多