使用sed

时间:2017-09-06 21:34:16

标签: string bash sed filenames

我有多个这样的文件:

  

67 572   Cy_aJATC23 ????????????????????????? GCCCTGCTGAGGCCCATAGTCACAGAAGGACAAAGTGCCAGACCACCCCCTTTCTGGCCTTTAATCTGTGGTGGTGCTGGCACTGCCTCCACACGGGCCTCACTGTGTGACAATGCTCCTTTCAGGTGAGGTCTGATCGGGACAAGTTCACAATCATGCTGGATGTAAAACACTTCTCTCCCGAAGACTTGAGTGTGAAGATTATTGATGACTTTGTGGAAATCCATGGCAAGCACAGTGAAAGGCAGGTAAGTGGAAGTGATGGTGATGGTGGAGAAACTGGAGAGTCCAGCTCCGTTTCCCTTCTTTCCAACGGTTCTCAGCTGAAGGAAAAAAAAAAAGAATATATCAGAAGAAGGAGTTAATTATGAATTGTCATTATTGGCACGGCCTGTTCCCATAGAGCCCCCATCTGATATCTGACAATAACAA

我想改变第一行

  

65 572

通过

  

['文件名'572'

该文件的名称是'ACA_exon2.phylip-sequential',我只想要第一部分'ACA_exon2',但我对所有人都很好,我可以在之后更改它。

我非常接近这个

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

这是结果

  

[$ file 572]   Cy_aJATC23 ????????????????????????????????????? ???????????????? TACCACCCAAGATGTTAACAAGCTGGCATGTTTTGAGCATCAAAGATAGAGAGGAAACTGTGTTTACATGTTTGGCACAAAAACTAATGAGGAAAGTCAATTGGCCCTTTGTCTTGAGGGTCTGAAGAGCCGCGCTCTAATGTTTGGTTTCTTGGTTGGCACTTGTTCAAGTAATCACTCGTGGCCTGACAAAGCAGCACTTGTGTTTTATTAGTGGCCATGCTGAACTCTCCTGCCTGGGCTATGTTGCCTCTCAATAGAGCACTGCACCAGAGGGCATACTTATTTGAAAACACTAAATCAGAGCATGATGATCTTTGCCCGACAAATACAACCAAGAGAGGAGAAAGAAAAGTGACAACAGCTCTCCTTTTGTTAGAGAAAGTGAGGAAACAACAACTGGTGTGTGTGCATGTGCATGTGTGTAAGATGAGTCCTGAAACACCGGTGACGAAATGAGCAAAACTTTGTTCCCATAATGTGATGCTCAGAACCAACTGGATT ???

sed无法将$ file识别为将名称保留在文本中的命令...

我想要这个

  

[ACA_exon2 572]   Cy_aJATC23 ????????????????????????????????????? ???????????????? TACCACCCAAGATGTTAACAAGCTGGCATGTTTTGAGCATCAAAGATAGAGAGGAAACTGTGTTTACATGTTTGGCACAAAAACTAATGAGGAAAGTCAATTGGCCCTTTGTCTTGAGGGTCTGAAGAGCCGCGCTCTAATGTTTGGTTTCTTGGTTGGCACTTGTTCAAGTAATCACTCGTGGCCTGACAAAGCAGCACTTGTGTTTTATTAGTGGCCATGCTGAACTCTCCTGCCTGGGCTATGTTGCCTCTCAATAGAGCACTGCACCAGAGGGCATACTTATTTGAAAACACTAAATCAGAGCATGATGATCTTTGCCCGACAAATACAACCAAGAGAGGAGAAAGAAAAGTGACAACAGCTCTCCTTTTGTTAGAGAAAGTGAGGAAACAACAACTGGTGTGTGTGCATGTGCATGTGTGTAAGATGAGTCCTGAAACACCGGTGACGAAATGAGCAAAACTTTGTTCCCATAATGTGATGCTCAGAACCAACTGGATT ???

你能帮我吗?

提前致谢

3 个答案:

答案 0 :(得分:0)

您尝试使用单数引号,因此,其中的变量不会被展开。 试试这个:

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

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

答案 1 :(得分:0)

Maxim对变量扩展是对的,但我相信在使用双引号时你需要转义反斜杠:

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

答案 2 :(得分:0)

假设:

$ 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