我有多个这样的文件:
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 ???
你能帮我吗?
提前致谢
答案 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