【问题标题】:how to remove part of the string if the condition exists [closed]如果条件存在,如何删除部分字符串[关闭]
【发布时间】:2020-11-02 13:34:22
【问题描述】:

我有一个类似的文件:

   A*01:03:05
   B1*02:06:08
   F2*03:01:06
   R5*02:01
   S1*02:08

并且想删除最后 2 个数字和冒号,只有当有 2 个冒号分隔符时。所以它会是:

   A*01:03
   B1*02:06
   F2*03:01
   R5*02:01
   S1*02:08

最后 2 行保持不变,因为它们在 * 之后没有 2 个冒号分隔符,因此不会对这些值进行任何更改

我使用sedgsub 删除了最后一个下划线之后的所有内容,但是当我在 * 后面没有 2 个冒号时,我不确定如何添加一个条件来豁免该条件。

【问题讨论】:

  • 请在您的问题中添加您的努力,这是非常鼓励的,谢谢。

标签: awk sed gsub


【解决方案1】:

这可能对你有用(GNU sed):

sed 's/:..//2' file

这将删除第二次出现的 : 后跟 2 个字符。

如果这太宽松,请使用:

sed -E 's/^([^:]*:[^:]*):[0-9]{2}/\1/' file

【讨论】:

    【解决方案2】:

    使用cut,您可以将: 设置为分隔符并仅打印前两个字段

    cut -d: -f-2 ip.txt
    

    类似的逻辑可以用awk完成,假设实现支持操作NF

    awk 'BEGIN{FS=OFS=":"} NF==3{NF=2} 1' ip.txt
    

    【讨论】:

      【解决方案3】:

      这行得通:

      $ sed -E 's/^([^:]*:[^:]*):[0-9][0-9]$/\1/' file
      

      [^:] 表示“除 : 之外的任何字符”,因此只有在有两个前导冒号时才会在末尾删除。

      这个awk 也可以:

      $ awk 'gsub(/:/,":")==2 {sub(/:[0-9][0-9]$/,"")} 1' file
      

      在这种情况下,gsub 返回进行的替换次数。所以如果有两个冒号,删除结尾。

      您还可以使用 GNU grep(带有 PCRE)来仅匹配您要查找的模板:

      $ grep -oP '^\w+\*\d\d:\d\d' file
      

      或者perl同样的方式:

      $ perl -lnE 'say "$1" if /(^\w+\*\d\d:\d\d)/' file
      

      【讨论】:

      • offtopic: *:[^:]* 部分在桌面浏览器上显示为斜体
      • @Sundeep:我也是,但我认为这是一个降价问题,不是吗?我没有对代码应用格式...
      • 是的,抱歉并不意味着这是您的问题.. 在发表评论之前,我点击了编辑以查看是否可以发现任何问题,但在这种情况下预览显示正常..跨度>
      猜你喜欢
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2013-05-12
      相关资源
      最近更新 更多