代码之家  ›  专栏  ›  技术社区  ›  Tiago Sousa Neves

使用sed更改多个文件中的字符串

  •  0
  • Tiago Sousa Neves  · 技术社区  · 7 年前

    我有多个这样的文件:

    67 572 Cy_aJATC23?????????????????????????GCCCTGCTGAGCCCATAGTCACAGAAGGACAAGTGCCAGACCACCCCCTTTCTGGCCTTATCTGTGGTGGTGCGCGCACTGCCTCCACACACAGGCCTCAGCGCCACTGCTGTGTGTGTGATCAATGCCCTCCAGTCTGATGCCAAGAGATCAAGAGATCAAGATCAGCCAAGATCTCCCGAAGACTTGATGAGTGAAGATGAATTATGATGTGGAAATCCATGCAAGCCAAGGTGAAGAGAGAGAGATGAGTGAGTGAGTGAGTGAGTGAGTGAGTGAGTGAGTGAGTGAGTGAGTGCGCGTTCTCTCTCTCTCTCTCAGATCAAGAAAAAGAGAAAAAAAGAGATAGAGAGATGCGAGTGAGTGAGTGAGTGAGTGAGTGAGTGCGCGCTCTCTCTCTCTCAtatatcagaagaagagttaattgatgatgatgtcatttggcacggcctgttcccATAGAGCCCCCATCTGATATCTGACAATAACAA

    我想换第一行

    通过

    文件名为“ACA\u exon2”。phylip sequential’我只想要第一部分‘ACA_exon2’,但我都同意,我可以在之后更改它。

    我对此非常了解

    for file in ~/folder/*; do sed -E 's/^ (\w+)( \w+)/\[$file\2]/g' $file ; done;

    这就是结果

    CYU aJATC23?????????????????????????????????????????????????????????????????TACCACCAGAGATGTTAACAAGAGCTGCATGTTTTGATCAAGATAGAGAAACTGTTTATGTGTTTGGCACAAAACTAATGTAGGAAAGTCATGGCCCTGTTGTGATGTGTGTGAAGCTGAAGAGGCGCGCTCTAATGTGTGTGTGTCAAGTAAGATCAAGACTTGTTATGGCAAGAGACTTGTTAGTCAGATGAACTTGTTTTAGCTGAACTCCTGCCTGCTGTTGCCTCAATGAATAGACTGCACCAGGCATTAGTGAAACAAACACAAGACTGCACCAGGCATGCATTATTGAAACAAACAAGATAGATGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAAGAAAGAGAGAAAGAGAGATGCATTTCCCCCAAGAGAGAGAGAGATAGATAGATAGATCACAGCTCTCTTTTGTTAGAAAGTGAGAAACACACTGGTGTGTGTGCATGTGCATGTGTAAGATGATCAACCGGTGACGCGAACGGACGAAATGAAACTTTTCCCataGTGATCAGAGATGCTCAGAAACTGGATT???

    我想要这个

    CYU aJATC23?????????????????????????????????????????????????????????????????TACCACCAGAGATGTTAACAAGAGCTGCATGTTTTGATCAAGATAGAGAAACTGTTTATGTGTTTGGCACAAAACTAATGTAGGAAAGTCATGGCCCTGTTGTGATGTGTGTGAAGCTGAAGAGGCGCGCTCTAATGTGTGTGTGTCAAGTAAGATCAAGACTTGTTATGGCAAGAGACTTGTTAGTCAGATGAACTTGTTTTAGCTGAACTCCTGCCTGCTGTTGCCTCAATGAATAGACTGCACCAGGCATTAGTGAAACAAACACAAGACTGCACCAGGCATGCATTATTGAAACAAACAAGATAGATGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAAGAAAGAGAGAAAGAGAGATGCATTTCCCCCAAGAGAGAGAGAGATAGATAGATAGATCACAGCTCTCTTTTGTTAGAAAGTGAGAAACACACTGGTGTGTGTGCATGTGCATGTGTAAGATGATCAACCGGTGACGCGAACGGACGAAATGAAACTTTTCCCataGTGATCAGAGATGCTCAGAAACTGGATT???

    你能帮我吗?

    提前感谢

    3 回复  |  直到 7 年前
        1
  •  0
  •   dawg    7 年前

    鉴于:

    $ cat f1.exon
    67 572 Cy_aJATC23 ?????????????????????????
    GCCCTGCTGAGGCCCATAGTCACAGAAGGACAAAGTGCCAGACCACCCCCTTTCTGGCCTT
    $ cat f2.exon
    67 573 Cy_aJATC23 ?????????????????????????
    GCCCTGCTGAGGCCCATAGTCACAGAAGGACAAAGTGCCAGACCACCCCCTTTCTGGCCTT
    

    你可以在 awk

    $ awk 'FNR==1{$1="[" FILENAME; $2=$2 "]"} 1' *.exon
    [f1.exon 572] Cy_aJATC23 ?????????????????????????
    GCCCTGCTGAGGCCCATAGTCACAGAAGGACAAAGTGCCAGACCACCCCCTTTCTGGCCTT
    [f2.exon 573] Cy_aJATC23 ?????????????????????????
    GCCCTGCTGAGGCCCATAGTCACAGAAGGACAAAGTGCCAGACCACCCCCTTTCTGGCCTT
    

    sed :

    for fn in *.exon; do 
        sed -E '1s/^[[:digit:]]+( [[:digit:]]+)/['"$fn"'\1]/' "$fn"
    done    
    # same output
    

    mv 临时文件将原始文件重命名为新内容:

    for fn in *.exon; do 
        awk 'FNR==1{$1="[" FILENAME; $2=$2 "]"} 1' "$fn" > a_temp_exon
        mv a_temp_exon "$fn"
    done
    

    具有 sed公司 -i

    说明:

    awk 'FNR==1{$1="[" FILENAME; $2=$2 "]"} 1' *.exon
          ^   ^                                       first line only
               ^                          ^           do this action
                ^                                     first field
                   ^     ^                            literal [ and FILENAME
                                 ^                    second field
                                     ^                it's same value
                                        ^             literal ]
                                            ^         print the line
    
        2
  •  0
  •   Maxim Norin    7 年前

    试试这个:

    sed -E "s/^ (\w+)( \w+)/\[$file\2]/g" $file
    

    sed -E 's/^ (\w+)( \w+)/\['$file'\2]/g' $file
    
        3
  •  0
  •   Louise    7 年前

    sed -E "s/^ (\\w+)( \\w+)/\\[$file\\2]/g" $file