文本处理:sed 向后工作以删除直到字符串

text processing: sed to work backwards to delete until string

我的 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

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

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

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

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

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

sed 's/\(.*\):.*//' 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