首先,不推荐使用sed
的原因如下:
sed
没有像grep
一样有对Perl正则模式的支持(grep
的-P
选项),因此无法使用\d
、\w
等方便缩短正则表达式的语法;sed
没有像grep
一样可以只输出一行中被匹配部分(grep
的-o
选项),因此需要使用小括号对匹配表达式进行分组,然后用\1
到\9
来回调对应的组(按正则表达式中小括号的左括号出现的顺序,对应回调顺序:第一个"(
"包裹的正则表达式的匹配结果对应\1
),同时还需要用表达式匹配掉不需要的部分,这就容易导致许多问题。
sed
的软件包描述是:GNU流编辑器
grep
的软件包描述是:字符串搜索实用程序
两者虽然功能上有重合的部分,但各自有各自擅长的领域。因此:
针对问题选择合适的解决方法,很重要。
最后,附上我的grep
匹配ip地址的命令:**
grep -Po '(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])(\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)){3}' demofile
以及我的sed
匹配ip地址的命令:
sed -nr 's#[^0-9]*((1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[1-9])(\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[0-9])){3}).*#\1#p' demofile
需要注意的是:
上面这句sed
命令有问题,我一直没有找到合适的解决办法,问题如下所示:
$ echo "1 127.0.0.1" | sed -nr 's#[^0-9]*((1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[1-9])(\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[0-9])){3}).*#\1#p'
1127.0.0.1
$ echo "a1b 127.0.0.1" | sed -nr 's#[^0-9]*((1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[1-9])(\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[0-9])){3}).*#\1#p'
a1127.0.0.1