BASH – sedreplaceIP变体

自从我在这里发布一个问题已经有一段时间了。 需要一些assistancew让我的sed工作。 我已经尝试了各种forms的sed选项,但似乎无法得到这个工作。 我有一个文件,其中有“192”*,并需要任何types的“192”类似的IP地址,所有删除,但我需要从字面上保持一切。 东西看起来像:

+ : root : 192.,local,10. + : root : local,192. + : root : local,192.,10. + : root : local,10.33.45.34,192.168.22.100 + : root : local,192.168.22.100,10.33.45.34 + : root : local,192.168 + : root : local,192.168,10. 

项目的我试过了:

 sed -e 's/,192.*$//g' -e 's/,192.*,//g' -e 's/192.,//g' sed -e 's/,192.*$//' -e 's/,192.*,//' -e 's/192.,//' sed -e 's/,192.*$//' -e 's/,192.*,//' -e 's/192.*,//' sed -e 's/,192.*$//' -e 's/,192.*,//' -e 's/192.,//' 

我刚刚疯了,所以一些帮助表示赞赏。

提前致谢。

我已经检查了这个sed,它几乎工作

 sed -e 's/,\?192\(\.\([0-9]\{0,3\}\)\)\{0,3\},\?//g' 

举个例子:

 [batchhercules@hercules ~]$ cat example.txt | sed -e 's/,\?192\(\.\([0-9]\{0,3\}\)\)\{0,3\},\?//g' + : root : local,10. + : root : local + : root : local10. + : root : local,10.33.45.34 + : root : local10.33.45.34 + : root : local + : root : local10. 

正如你可以在第3,5,7行看到的,它将取代两个逗号,这是不好的。 所以升级为:

 sed -e 's/,192\(\.\([0-9]\{0,3\}\)\)\{0,3\}//g' -e 's/192\(\.\([0-9]\{0,3\}\)\)\{0,3\},//g' 

哪个为你的例子将工作得很好:

 [batchercules@hercules ~]$ cat example.txt | sed -e 's/,192\(\.\([0-9]\{0,3\}\)\)\{0,3\}//g' -e 's/192\(\.\([0-9]\{0,3\}\)\)\{0,3\},//g' + : root : local,10. + : root : local,10.134. + : root : local,10. + : root : local,10.33.45.34 + : root : local,10.33.45.34 + : root : local + : root : local,10. 

我的build议:使用Perl。

perl-test是一个包含OP中数据的文件:

 $ perl -pe 's/(?:(\s)192.*?(?:,|$))|(?:,192.*?(,|$))/$1$2/g' perl-test + : root : local,10. + : root : local + : root : local,10. + : root : local,10.33.45.34 + : root : local,10.33.45.34 + : root : local + : root : local,10. 

你可以很容易地捕捉内容,并将其pipe入perl -pe...

Perl的正则expression式parsing非常像sed,但更强大。

说明:

(?:) – 在括号前添加?:使其成为非捕获组 。 这样,仅用于分组的括号不会影响您在replacestring中使用的后向引用$1$2variables。

(\s) – 捕获replacestring中用作$ 1的空白。 你想匹配192个IP地址前面加空格,这样你就可以把它识别为列表的开头,并保留后面的逗号。 你仍然想保留空白。

192.*? – 非贪婪的比赛。 匹配到下一个逗号。 Perl中的默认行为(以及sed中的唯一行为)是匹配到最后一个逗号。 这不是你想要的,你会看到有超过三个IP地址的列表中的差异。

(?:,|$) – 非捕获组告诉非贪婪匹配以第一个逗号结束,或者在行尾。

| – 显然,交替到下一个正则expression式匹配。

,?192.*? – 非贪婪的192匹配不匹配列表的开头。

(,|$) – 就像之前一样,匹配192个IP地址后面的第一个逗号。 在这种情况下,你想要捕获逗号。 你想保留它,因为你摆脱了前面的逗号,?192.*? 其后的列表中可能还有其他项目。 当然,如果后面的列表中没有其他项目,则会匹配行尾$ 。 在replacestring中引用$作为$2就不会做任何事情; 引用,将为您准备下一个列表项目。 所以你覆盖任何方式。

希望这样做有一些道理!