2014-03-12 119 views
0

我有一個名爲file.txt的文件,該文件包含以下內容:慶典循環替換字符串

123 
223 
Lane,id,s_id_sample_id 
1,3_range.single_try,N76 
2,44_range.single_try,N77 
3,92_out_range.double_try,N79 

我想通過這個文件的循環,並做到以下幾點:

從行開始在'Lane'後用逗號分隔,然後取第二列(id) ,然後取id列並分割成下劃線,然後 用'X'搜索並替換所有的點和下劃線,除了最後兩個UNDERSCORES。所以不要搜索並替換最後的下劃線(例如double_try)。

所以會喜歡直到結束:

123 
223 
Lane,id,s_id_sample_id 
1,3Xrange_single_try,N76 
2,44Xrange_single_try,N77 
3,92XoutXrange_double_try,N79 

這是我做了什麼:

while IFS=',' read -r f1 f2; do 
sed -e 's/_/X/g;s/\./X/g;s/' 
echo "$f1,$f2" 
done < "$file" > output 
mv output $file 

的問題是我怎麼可以指定忽略最後兩個下劃線?

回答

1

這是通過首先將最後兩個點或'@'下劃線,然後更換剩下的點,並與'X'強調,最後,用下劃線代替所有'@'字符:

IFS=',' 
while read -r f1 f2 f3; do 
    f2=$(sed 's/[._]\([^._]\+\)[._]\([^._]\+\)$/@\[email protected]\2/;s/[._]/X/g;s/@/_/g' <<< "$f2") 
    echo -n "$f1" 
    [[ -n $f2 ]] && echo -n ",$f2" 
    [[ -n $f3 ]] && echo -n ",$f3" 
    echo 
done < "$file" > output 
mv output "$file" 

如果'@'可能發生在您的輸入數據中,您可能需要使用不同的字符。任何你可以合理確定的事情都不會發生在你的輸入中。