2014-03-12 75 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" 

如果'@'可能发生在您的输入数据中,您可能需要使用不同的字符。任何你可以合理确定的事情都不会发生在你的输入中。