linux sed命令无法正确输出

ajsxfq5m  于 12个月前  发布在  Linux
关注(0)|答案(3)|浏览(158)

我在使用sed命令时卡住了。我试图使用sed命令获取我的网络地址。我的主机就像

$ hostname -I
192.168.11.12

字符串
我想从上面的地址中只得到“192.168.11.”。

hostname -I | sed -E  's/([0-9]{1,3}\.)([0-9]{1,3}.)([0-9]{1,3}\.)([0-9]{1,3})$/\1\2\3/'


但它不工作,我得到

192.168.11.12


即使

echo "192.168.11.12" | sed -E  's/([0-9]{1,3}\.)([0-9]{1,3}.)([0-9]{1,3}\.)([0-9]{1,3})$/\1\2\3/'


工作正常。有人知道是什么问题吗?
我的环境:Ubuntu 22.04.3 LTS

nc1teljy

nc1teljy1#

@Wiimm已经给出了一个解释:该行以空格结束。
你可以看看echo "<$(hostname -I)>",响应将以>结束。
当你知道你总是得到一个IP地址时,你可以使用hostname -i | cut -d '.' -f1,3
当响应可以是1.2.3.4 1.2.3.5 1.2.4.1时,你想要什么?

# Show the substring from the first address
echo '1.2.3.4 1.2.3.5 1.2.4.1 ' | cut -d '.' -f1-3
1.2.3

# Show all sub-addresses (you can `| sort -u` when you want to)
$ echo '1.2.3.4 1.2.3.5 1.2.4.1 ' | tr ' ' '\n' | cut -d '.' -f1-3
1.2.3
1.2.3
1.2.4

# Other way to show the three sub-addresses
$ echo '1.2.3.4 1.2.3.5 1.2.4.1 ' | grep -Eo '[^ .]*\.[^ .]*\.[^ .]*'

字符串

hsvhsicv

hsvhsicv2#

你把事情弄得太复杂了。

hostname -I |
sed 's/\.[^.]*$//'

字符串
就像,删除最后一个点和它后面的所有文本。
您尝试的直接问题似乎是一个点前缺少反斜杠,和/或缺少行开头的锚;尽管如果不是因为有一些明显不可见的文本,这些都不会是致命的(一个空格?或者一些控制字符?)在hostname输出的末尾。也许把它传递到cat -vod -tx1,看看它到底打印了什么。

v6ylcynt

v6ylcynt3#

看起来sed命令中的问题与regex模式及其应用方式有关。
试试这个

hostname -I | sed -E 's/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.).*/\1/'

字符串
看看有没有用

相关问题