簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM