sed - 如何从第二列中删除A-Z

时间:2013-03-26 18:26:45

标签: bash sed

我已经能够通过awk print $ 2,sed [a-z]等分段完成这项工作,但是如何通过sed一次性对一个流进行此操作?

host_192.168.0.100 host_192.168.0.100

变成

host_192.168.0.100 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

谢谢!

3 个答案:

答案 0 :(得分:1)

试试这个:

sed 's/^\([^ ]*\) [a-z_-]*\(.*\)/\1 \2/i'

修改:已更新,以反映更改的要求。

答案 1 :(得分:1)

一种可行的简单方法:

sed 's/ [A-Za-z_]*/ /'

示例:

$ sed 's/ [A-Za-z_]*/ /' <<<'host_192.168.0.100 host_192.168.0.100'
host_192.168.0.100 192.168.0.100

答案 2 :(得分:1)

鉴于第二个示例,您似乎要删除第一个空格后出现的所有非数字,逻辑上在第一个数字之前。你需要它来删除破折号,下划线,甚至点,以及字母;任何不是数字的东西。这表明:

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个独立的清理表达式。第一个,如前所述,在空格后立即删除任何非数字。它不太可能需要调整。

{p> 01-admin-这条线虽然没有受到影响;第二个正则表达式通过查找空白,一系列非点后跟短划线,然后捕获以数字开头的序列,继续交错的数字和点,以数字结尾,替换为记住的数字和点串。匹配破折号是这项工作的关键;如果你不小心,*太贪婪了(例如,s/ .*\([0-9][0-9.]*[0-9]\)/\1/从IP地址组件中取出了前导数字。我假设sed没有非贪婪的量词,例如*?;如果你的版本确实存在,你可能会得到一个不同的答案(但是这个版本也会起作用)。您可能需要调整该模式以处理其他异常情况;请为自己做,而不是编辑这个问题。

第三个正则表达式处理尾随-NET和其他此类材料;它会查找并记住数字和点的序列(以数字开头和结尾),然后是非数字,非点字符和任何其他尾随材料,将其替换为记住的数字和点串。这不太可能需要大量调整。