2014-02-13 32 views
-1

我想做一個操作來截斷或重新引入字符串中的特殊字符。所以我決定使用sed進行這個操作。然而,發生規格似乎並不9後,開始工作:超出9的SED發生規範

的字符串是:

dotLessLogName -/FTTIPIFT1FT751632ADRR262521251T-2521251-01Y20120925_102339csvgz

我的sed命令:

echo "$dotLessLogName" | sed 's/\([/]\{1\}\)\([A-Z]\{2\}\)\([A-Z]\{4\}\)\([A-Z]\{2\}\)\([0-9]\{1\}\)\([A-Z]\{2\}\)\([0-9]\{6\}\)\([A-Z]\{4\}\)\([0-9]\{2\}\)\([0-9]\{7\}\)\([A-Z]\{1\}\)\([-]\{1\}\)\([0-9]\{7\}\)\([-]\{1\}\)\([0-9]\{2\}\)\([A-Z]\{1\}\)\([0-9]\{8\}\)\([_]\{1\}\)\([0-9]\{6\}\)\([a-z]\{3\}\)\([a-z]\{2\}\)/\2,,\3,,\4\5,,\6\7\8\9,,\10,,\11,,\12,,\13,,\14,,\15,,\16,,\17,,\18,,\19,,\20,,\21/' 

由於您可以看到,我正在嘗試引入,,(以CSV文件分開列表字段)

但是,輸出是:

FT,,TIPI,,FT1,,FT751632ADRR26,,/0,,/1,,/2,,/3,,/4,,/5,,/6,,/7,,/8,,/9,,FT0,,FT1 

它似乎能夠正常工作的第一個9個實例,但在此之後它會發瘋!

請幫助我們嗎?

-Naga

+0

對此使用awk或perl。 – anubhava

回答

0

GNU sed的,它的出現,只能管理到9反向引用: [ref]

替換可以包含\ nÑ是1到9的數字,包括1和9)參考文獻

Yo你有很多捕獲你不需要,因爲你只是在替換中連接它們。我要做到這一點在Perl,其中m//運算符返回捕獲作爲一個列表在列表環境時:

$ echo "$dotLessLogName" | perl -lne 'print join ",,", m/\/([A-Z]{2})([A-Z]{4})([A-Z]{2}\d)([A-Z]{2}\d{6}[A-Z]{4}\d{2})(\d{7})([A-Z])(-)(\d{7})(-)(\d{2})([A-Z])(\d{8})(_)(\d{6})([a-z]{3})([a-z]{2})/' 
FT,,TIPI,,FT1,,FT751632ADRR26,,2521251,,T,,-,,2521251,,-,,01,,Y,,20120925,,_,,102339,,csv,,gz 

你沒有包括您所需的輸出,請證實輸出。

+0

謝謝anubhava和glenn,我已經開始了,現在正在使用awk。 Glenn - 特別感謝你。我將保存這個Perl代碼以供將來參考。 再次謝謝你。 -Naga – user2174771

相關問題