在实践中,我可能会使用jasonwryan解决方案,但要回答为什么您的sed
命令不起作用是因为您使用的是扩展正则表达式,甚至是兼容 perl 的正则表达式。要与 ERE 一起使用,您需要使用与BSD 变体或与 BSD 变体sed
一起显式打开它。但是不支持 PCRE,但您可以放弃使用非捕获组,因为它在这里并没有真正的帮助。-r
GNU sed
-E
sed
因为你只是模式匹配grep
可能会更好sed
:
$ grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' file
78.110.75.245
188.175.142.13
58.137.11.145
109.93.248.151
37.131.64.203
请注意,锚点也需要丢弃,也就是说^
,$
因为您要匹配的模式不是从字符串的开头开始,也不是在结尾结束。grep
默认情况下也不支持扩展正则表达式,因此-E
仅-o
打印行的匹配部分而不是整行。
最后一个问题是你刚刚给出了sed
正则表达式和一个文件。sed
is 不会grep
也不会只打印出匹配的行(虽然它当然可以,但这不是你这样做的方式)。一种方法是使用替换命令s
并替换 IP 之前的所有内容和之后的所有内容:
$ sed -r 's/.+[[]([^]]+).+/\1/' file
78.110.75.245
188.175.142.13
58.137.11.145
109.93.248.151
37.131.64.203
正则说明:
s # sed substitute command
/ # the delimiter marking the start of the regexp
.+ # one or more of any character
[ # start a character class
[ # character class contains a single opening square bracket
] # close character class (needed so single [ isn't treated as unclosed)
( # start capture group
[ # start character class
^]+ # one or more character not an ]
] # end character class
) # end capture group
.+ # one or more of any character
/ # the delimiter marking the end of the regexp and start of replacement
\1 # the first capture group
/ # the delimiter marking the end of the replacement
这是不同正则表达式风格的比较。