2017-02-28 53 views
2

我想根據上下文與sed轉換一個變量字符串。可變字符串轉換與sed

string="GAGGTGGGTGGGGAGC" 
echo $string | sed -r 's/G+([AT])/A+\1/g' 

結果是:A+AA+TA+TA+AGC。但我預計:AAAATAAATAAAAAGC

換句話說,我想用一個A或T代替一個未知的Gs片段。我們如何恢復匹配的模式的Gs數量以重用它在替代模式?

+2

'。不幸的是,sed不支持lookaround。 –

+0

很棒!謝謝。對於記錄,要使用的命令行是:'echo $ string | perl -pe's/G(?= G * [AT])/ A/g' – retrogenomics

+0

請注意,在這種情況下,建立一個小型狀態機來解析是很簡單的。如果您需要處理大量數據並定期執行此操作,則可能需要付出額外的努力。另外,如果你有很多字符串需要處理,一定要將它們作爲流傳遞給sed,而不是每次處理一個字符串都調用sed,這會大大減慢處理速度。 – Fred

回答

3

隨着SED,使用反向引用和t(測試)命令循環在進一步替換命令的開始,如果置換成功:

$ sed ':a;s/G\([AT]\)\(.*\)/A\1\2/;ta;' <<< "GAGGTGGGTGGGGAGC" 
AAAATAAATAAAAAGC 

它是如何工作的:

  • :aa即將到來的循環標籤
  • s:替代命令
  • G\([AT]\):搜索G,然後是AT。第二個字母被捕獲,並且將在替換字符串使用反向引用
  • \(.*\)使用:捕獲剩餘的字符
  • A\1\2:與A接着先前捕獲的字符串(AT和剩餘的字符)
  • ta取代:如果先前的替代使用`perl`,你可以使用一個像`s/G(?= G * [AT])/ A/g這樣的正則表達式來代替腳本來檢查腳本的進一步替換
+0

它運作良好,但你能解釋背後的邏輯嗎? – retrogenomics

+0

請參見[用't'測試](http://www.grymoire.com/Unix/Sed.html#uh-59)。 –

+0

@retrogenomics我添加了一些解釋。 – SLePort