Ana*_*Das 3 command-line scripts sed
我有一个句子,其中包含一个 IP 地址。例如,
This sentence contains an ip number 1.2.3.4 and port number 50, i want to print the IP address only.
Run Code Online (Sandbox Code Playgroud)
从上面的句子来看,我只想打印 IP 地址。我怎样才能做到这一点?我听说可以用sed
这是可能的,但不优雅:
echo 'This sentence contains an ip number 1.2.3.4 and port number 50, i want to print the IP address only.' \
| sed 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/'
Run Code Online (Sandbox Code Playgroud)
[0-9]匹配任何数字,\{1,3\}意味着它可以重复 1 到 3 次。\.匹配一个点。整个 IP 由\(...\)括号捕获,前后匹配的内容.*,即任何重复零次或多次的内容。然后整个匹配字符串(即整行)被第一个匹配组的内容替换。
您可以通过引入变量使其更具可读性:
n='[0-9]\{1,3\}'
... | sed "s/.*\($n\.$n\.$n\.$n\).*/\1/"
Run Code Online (Sandbox Code Playgroud)
如果未找到 IP,它将打印整个字符串。它也不检查像 256.512.999.666 这样的无效 IP。
这是一个grep解决方案:
echo "$sentence" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
Run Code Online (Sandbox Code Playgroud)
-o 只打印匹配的部分-E 切换到扩展正则表达式[0-9])匹配一次或多次 ( +),然后匹配一个点 ( \.) 并再次匹配数字...这是另一个解决方案perl:
echo "$sentence" | perl -l -ne '/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ && print $&'
Run Code Online (Sandbox Code Playgroud)
-l 指定行终止符(换行符)-n通过由echo(可以是多行)给出的输入循环-e 代码如下grep解决方案中的非常相似