给定第二个示例,您似乎想要删除出现在第一个空格之后的所有非数字,逻辑上在第一个数字之前。您需要它来删除破折号、下划线、甚至点以及字母;任何不是数字的东西。这表明:
sed -e 's/ [^0-9]*/ /'
这是相当简约的,但符合您的标准:
$ cat data
host_192.168.0.100 host_192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 ab-ab-abababab-ABABABAB-000.000.000.0
$ sed -e 's/ [^0-9]*/ /' data
host_192.168.0.100 192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 000.000.000.0
$
编写好的正则表达式的很大一部分技巧是写一个好的描述你希望正则表达式实际做的事情(用对正则表达式有意义的术语)。
这三个带有前导数字和字母以及尾随材料的新项目使生活变得相当复杂:
$ cat data
host_192.168.0.100 host_192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 ab-ab-abababab-ABABABAB-000.000.000.0
01-admin-10.10.10.10 01-admin-10.10.10.10
10.10.10.10-NAT 10.10.10.10-NAT
1test-10.10.10.10 1test-10.10.10.10
$ sed -e 's/ [^0-9]*/ /' \
> -e 's/ [^.]*-\([0-9][0-9.]*[0-9]\)/ \1/' \
> -e 's/ \([0-9][0-9.]*[0-9]\)[^0-9.].*$/ \1/' data
host_192.168.0.100 192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 000.000.000.0
01-admin-10.10.10.10 10.10.10.10
10.10.10.10-NAT 10.10.10.10
1test-10.10.10.10 10.10.10.10
$
该sed
脚本获取 3 个独立的清理表达式。第一个和以前一样,在空格后立即删除所有非数字。不太可能需要调整。
不过这01-admin-
条线没有受到影响;第二个正则表达式通过查找一个空白、一个非点序列后跟一个破折号来处理这个问题,然后捕获一个以数字开头、以交错的数字和点继续,并以数字结尾的序列,将其替换为记住的数字和点串。匹配破折号是正常工作的关键。如果您不小心,*
则太贪心了(例如,s/ .*\([0-9][0-9.]*[0-9]\)/\1/
从 IP 地址组件中吞噬了前导数字)。我假设sed
没有非贪婪的量词,例如*?
; 如果您的版本是这样,您可能会想出一个不同的答案(但这个版本也可以)。您可能需要调整该模式以处理其他异常情况;请为自己做,而不是作为对这个问题的编辑。
第三个正则表达式处理尾随-NET
和其他此类材料;它查找并记住数字和点的序列(以数字开头和结尾),后跟非数字、非点字符和任何其他尾随材料,并将其替换为记住的数字和点串。这不太可能需要太多调整。