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

Change string in multiple files using sed

我有多个这样的文件:

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

我要更改第一行

65 572

来自

['name of the file' 572]

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

我对此非常满意

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

这是结果

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

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

我想要这个

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

你能帮帮我吗?

提前致谢

您尝试使用单引号,这样,其中的变量将不会展开。 试试这个:

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

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

Maxim 关于变量扩展是正确的,但是我相信您在使用双引号时需要转义反斜杠:

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

给定:

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

您可以在 awk 中执行此操作:

$ awk 'FNR==1{="[" FILENAME; = "]"} 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"']/' "$fn"
done    
# same output

如何保存到文件中?

您可以将文件重定向到临时文件,然后 mv 临时文件重命名原始文件新内容:

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

使用 sed 只需使用 -i 就地替换选项。

解释:

awk 'FNR==1{="[" FILENAME; = "]"} 1' *.exon
      ^   ^                                       first line only
           ^                          ^           do this action
            ^                                     first field
               ^     ^                            literal [ and FILENAME
                             ^                    second field
                                 ^                it's same value
                                    ^             literal ]
                                        ^         print the line