我正在嘗試修改給定的文本檔案,其中我想更改/更改以下字串,例如:
lcl|NC_018257.1_cds_XP_003862892.1_5067
lcl|NC_018241.1_cds_XP_003859498.1_1683
lcl|NC_018256.1_cds_XP_003862456.1_4633
lcl|NC_018237.1_cds_XP_003858978.1_1163
lcl|NC_018254.1_cds_XP_003861926.1_4104
所以它只包含XP_n.1字串的一部分。
我已成功lcl|NC\_*.1_cds\_從使用以下sed命令的字串中洗掉了該部分:
sed 's/lcl|NC\_.\*_cds_//g' cds.fa > cds4.fa
生成的文本檔案包含類似XP_003862892.1_5067.
大約有 8014 個這樣的字串,范圍從XP_*.1_1到XP_*.1_8014. 我想洗掉字串的_1to_8014部分并將其替換為 1。
我嘗試使用
sed 's/1\_./1/g'
它似乎奏效了,但是當我進一步向下滾動字串串列時,兩位數字沒有被替換 - 只有一個數字被替換,緊跟在“_”之后,導致第一個數字翻轉成 1,其余保留其原始身份。與三位數和四位數相同。例如:
XP_003857837.1_23 ---> XP_003857837.13
XP_003857942.1_228 ---> XP_003857942.128
我完全不知道如何洗掉它,我所有的嘗試都導致了失敗。有人問我想要的輸出應該是什么樣子,理想的輸出應該是:XP_003857837.1,每個字串后面應該跟一個 .1 而不是 .1_SomeNumberRangingFrom1to8014
uj5u.com熱心網友回復:
您可以使用稍微復雜的正則運算式一次性完成所有操作。
sed 's/lcl|NC_.*_cds_\(XP_[0-9.]*\)_.*/\1/' cds.fa > cds4.fa
反斜線括號創建一個捕獲組,并\1在替換中呼叫第一個捕獲的組(\2對于第二個,等等,如果你有多個)。組內的正則運算式查找XP_后跟數字和點,之后的運算式匹配從下一個 uderscore 開始的行的其余部分。
換句話說,這基本上是說“用我們關心的部分替換整行”。
順便說一句,沒有理由在任何地方使用反斜杠下劃線,并且/g該命令的選項僅在您想要替換同一輸入行上的s多個匹配項時才有意義。
uj5u.com熱心網友回復:
使用sed
$ sed 's/.*_\?\(XP_[^.]*\.\)[^_]*_[0-9]\(.*\)/\11\2/'
XP_003862892.1067
XP_003859498.1683
XP_003862456.1633
XP_003858978.1163
XP_003861926.1104
XP_003857837.13
XP_003857942.128
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/450174.html
