【问题标题】:text processing: sed to work backwards to delete until string文本处理:sed 向后删除直到字符串
【发布时间】:2015-06-19 07:19:03
【问题描述】:

我的 AWK 脚本根据所使用的文本文件生成以下 2 个输出中的 1 个。

49 1146.469387755102 mongodb 192.168.0.8:27017 -p mongodb.database

1 1243.0 jdbc:mysql 192.168.0.8:3306/ycsb -p db.user

我需要一种方法来删除 IP 地址之后的所有内容,包括端口号。

sed 's/:[^:]*//2g'

除了它从左到右删除这一事实外,由于其中一个输出包含 2 : ,它会停止并删除之后的所有内容。有没有办法让 sed 从右向左工作?

为了清楚起见,每个期望的输出是:

49 1146.469387755102 mongodb 192.168.0.8

1 1243.0 jdbc:mysql 192.168.0.8

【问题讨论】:

    标签: awk sed text-processing


    【解决方案1】:

    你可以使用下面的 sed 命令。

    sed 's/:[0-9]\{4\}.*//' file
    

    sed 's/:[^:]*$//' file
    

    [^:]* 否定字符类匹配任何字符但不匹配:,零次或多次。 $ 匹配行边界的结尾。所以:[^:]*$ 匹配从最后一个冒号到结尾的所有字符。用空字符串替换那些匹配的字符将为您提供所需的输出。

    【讨论】:

      【解决方案2】:

      您可以利用 Kleene * 的贪婪本性:

      sed 's/\(.*\):.*/\1/' file
      

      .* 尽可能多地消耗,同时仍然匹配模式。捕获的部分行用于替换。

      或者,使用 awk(感谢 glenn jackman 让我直截了当):

      awk -F: -v OFS=: 'NF{NF--}1' file
      

      将输入和输出字段分隔符设置为冒号,通过递减NF 删除最后一个字段。 1 为真,因此执行默认操作 {print}NF 条件可防止空行导致错误,这在您的情况下可能不是必需的,但没有害处。

      输出任一方式:

      49 1146.469387755102 mongodb 192.168.0.8
      
      1 1243.0 jdbc:mysql 192.168.0.8 
      

      【讨论】:

        猜你喜欢
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2018-08-27
        • 1970-01-01
        • 2015-11-10
        相关资源
        最近更新 更多