文本处理: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
我的 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