【问题标题】:Remove hyphen between numbers only if hyphen follows more than 2 digits仅当连字符后跟超过 2 位数字时才删除数字之间的连字符
【发布时间】:2016-01-20 15:05:47
【问题描述】:

仅当连字符后跟超过 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

但它会替换所有带连字符的数字的连字符。

有什么帮助吗?

【问题讨论】:

  • 为什么不应该将12-01-2015 转换为12-012015?第二个连字符 IS 后跟多于 2 个数字。等一下 - 你的主题是hyphen follows more than 2 digits,但你的文字是hyphen is followed by more than 2 digits。你要哪个?还是两者之一?
  • 基本上它背后的想法是保持日期不变并结合日期以外的其他数字。
  • 那么该方法应该只是从任何与日期正则表达式不匹配的数字和连字符字符串中删除连字符,例如在 awk 中会是 /[0-9-]+/ && !/[0-9]{2}-[0-9]{2}-[0-9]{4}/。无论如何,看起来你有一个满意的答案......

标签: linux unix awk sed


【解决方案1】:

您必须指定“两个以上”:

$ 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

在基本的正则表达式(没有选项的 GNU sed 所做的)中,() 匹配文字括号,您必须为捕获组转义它们。量词周围的大括号也是如此:\{3,\} 是“三个或更多”。

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

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

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2016-09-07
    • 2020-05-21
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2019-11-18
    相关资源
    最近更新 更多