Bash选择性替换点

时间:2014-05-12 17:12:33

标签: bash sed

我的文件名格式如下:

My.File.d01.h01.txt
My.New.File.d01.h02.txt
My.Another.File.d01.h03.txt
My.Yet.Another.File.d01.h04.txt
File.d01.h05.txt

我想删除'd01.h01','d01.h02','d01.h03'等之间的点。

我想我需要使用某种形式的sed,但我需要保留dXX和hYY值。

期望的输出:

My.File.d01h01.txt
My.New.File.d01h02.txt
My.Another.File.d01h03.txt
My.Yet.Another.File.d01h04.txt
File.d01h05.txt

任何帮助?

2 个答案:

答案 0 :(得分:1)

利用反向引用:

sed -r 's/(\bd[0-9]+)\.(h[0-9]+)/\1\2/' inputfile

对于您的样本输入,它会产生:

My.File.d01h01.txt
My.New.File.d01h02.txt
My.Another.File.d01h03.txt
My.Yet.Another.File.d01h04.txt
File.d01h05.txt

d之前检查字边界或确保其前面有.

sed -r 's/(\.d[0-9]+)\.(h[0-9]+)/\1\2/' inputfile

答案 1 :(得分:0)

以下是可能有用的awk

awk -F. '{for (i=1;i<NF;i++) {if ($i~/d[0-9][0-9]/) f=1;printf "%s"(f?"":FS),$i}print FS $NF;f=0}' file
My.File.d01h01.txt
My.New.File.d01h02.txt
My.Another.File.d01h03.txt
My.Yet.Another.File.d01h04.txt
File.d01h05.txt