自从我在这里发布一个问题已经有一段时间了。 需要一些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就不会做任何事情; 引用,将为您准备下一个列表项目。 所以你覆盖任何方式。
希望这样做有一些道理!