![](/img/trans.png)
[英]Using sed to search and replace in multiple files, with a start and end string
[英]Change string in multiple files using sed
我有多個這樣的文件:
67 572 Cy_aJATC23 ????????????????????????? GCCCTGCTGAGGCCCATAGTCACAGAAGGACAAAGTGCCAGACCACCCCCTTTCTGGCCTTTAATCTGTGGTGGTGCTGGCACTGCCTCCACACGGGCCTCACTGTGTGACAATGCTCCTTTCAGGTGAGGTCTGATCGGGACAAGTTCACAATCATGCTGGATGTAAAACACTTCTCTCCCGAAGACTTGAGTGTGAAGATTATTGATGACTTTGTGGAAATCCATGGCAAGCACAGTGAAAGGCAGGTAAGTGGAAGTGATGGTGATGGTGGAGAAACTGGAGAGTCCAGCTCCGTTTCCCTTCTTTCCAACGGTTCTCAGCTGAAGGAAAAAAAAAAAGAATATATCAGAAGAAGGAGTTAATTATGAATTGTCATTATTGGCACGGCCTGTTCCCATAGAGCCCCCATCTGATATCTGACAATAACAA
我想換第一行
65572
通過
['文件名'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 ???
你能幫我嗎?
提前致謝
您嘗試使用單引號,因此,其中的變量將不會擴展。 嘗試這個:
sed -E "s/^ (\w+)( \w+)/\[$file\2]/g" $file
要么
sed -E 's/^ (\w+)( \w+)/\['$file'\2]/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{$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
inplace替換選項即可。
說明:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.