使用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
我有多个这样的文件:
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