bash循环通过文件替换字符串

时间:2014-03-12 16:50:28

标签: bash shell loops file-io

我有一个名为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'搜索并替换所有点和下划线。除了最后两个理解之外。所以不要搜索并替换最后一个下划线(例如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 个答案:

答案 0 :(得分:1)

首先用'@'替换最后两个点或下划线,然后用'X'替换剩余的点和下划线,最后用下划线替换所有'@'个字符:

IFS=','
while read -r f1 f2 f3; do 
  f2=$(sed 's/[._]\([^._]\+\)[._]\([^._]\+\)$/@\1@\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"

如果输入数据中可能出现'@',您可能需要使用其他字符。任何你可以合理肯定的东西都不会出现在你的输入中。