sed里面默认走的是最大匹配,sed删除的时候如果行当中多次出现()这种情况,这种情况下会最大化的匹配(),从而将我们需要的字符也去除,这不是我们要的结果,如下面这个例子
文件aaa内容如下:
wt_yunnan 1.1.1.1(wt__pic_zu1), 2.2.2.2(wt_pic_zu8),3.3.3.3(wt_pic_zu3),
Pakistan_PTCL 4.44.4.4(AS_pic_zu1), 5.5.5.5(AS__pic_zu11),
changkuan_taiyuan 6.6.6.6(ck_pic_zu1), 7.7.7.7(ck_pic_zu2),
使用命令:sed 's/(.*)//g' aaa
会发现最大化的匹配()当中的字符,导致不需要删除的字符也被删除,如下图
解决方式如下
使用命令:sed 's/([^(.*^)]*)//g' aaa或者 sed 's/([^(.*]*)//g' aaa或者sed 's/([^).*]*)//g' aaa
注意点:^( ^)指定括号当中匹配不允许包含()
运行结果如下:
基本原理如下:指定匹配字符里面不包含( 或者是不包含 ) 或者是()都不包含,其他字符同样也是类似的处理逻辑,这样就可以做到最小匹配,将我们需要的字符匹配出来进行替换或者剔除等操作