2016-01-20 68 views
2

只有连字符后面跟2位以上的字符,才能删除连字符?只有连字符跟在2位以上时,才能删除连字符之间的连字符

输入:

101|9881|Customer contact on 12-01-2015|AXD 

102|9882|Declined sales. 122-333-1234 contact|XYZ 

输出:

101|9881|Customer contact on 12-01-2015|AXD 

102|9882|Declined sales. 1223331234 contact|XYZ 

我已经使用这个......

sed 's/([0-9])-([0-9])/\1\2/g' inputfile 

,但它所有的复姓数字替换连字符。

请帮忙吗?

+0

为什么不应该'12-01-2015'转换为'12-012015'?第二个连字符后跟2个以上的数字。挂断 - 你的主题说'连字符超过2位数字',但你的文字说'连字符后面跟着超过2位数字'。你要哪个?或者它或者两者兼而有之? –

+0

基本上它背后的想法是保持日期原样,并结合日期以外的其他数字。 – Syeda

+0

然后,该方法应该简单地从任何与日期正则表达式不匹配的数字和连字符串中移除连字符,例如,在awk中它会是'/ [0-9 - ] +/&&!/ [0-9] {2} - [0-9] {2} - [0-9] {4} /'。无论如何,看起来你有一个你很满意的答案... –

回答

2

您必须指定“大于二”:

$ sed 's/\([0-9]\{3,\}\)-/\1/g' <<< '101|9881|Customer contact on 12-01-2015|AXD 
> 102|9882|Declined sales. 122-333-1234 contact|XYZ' 
101|9881|Customer contact on 12-01-2015|AXD 
102|9882|Declined sales. 1223331234 contact|XYZ 

在基本正则表达式(不带选项的sed什么GNU一样),()匹配字面括号,你必须逃脱他们的捕获组。量词附近的括号相同:\{3,\}是“三个或更多”。

如果您的sed支持它(为GNU sed的:-r选项),您可以使用扩展的正则表达式,从而简化了命令

sed -r 's/([0-9]{3,})-/\1/g'