如何使用SED将字符串中的最后一个特定字符(点)替换为制表符?字符串是一个IP地址

如何使用SED将字符串中的最后一个特定字符(点)替换为制表符?字符串是一个IP地址,sed,Sed,我只想用制表符替换字符串(IP地址)中的最后一个字符(点)。假设,如果我有10.25.16.19.4,我希望输出为10.25.16.19.4(在最后一个点之后,我们拥有的是端口)。 如果我们有localhost.42916,则预期输出为:-localhost 42916 捕捉点是:-只有最后一个点应替换为制表符,其余的应保留不变 谢谢。我会用这个替代品: s@\(.*\)\.@\1\t@ 也就是说,捕获到最后一个点的所有内容,将其替换为自身加上一个选项卡。使用线尾锚定$: sed -e 's/

我只想用制表符替换字符串(IP地址)中的最后一个字符(点)。假设,如果我有10.25.16.19.4,我希望输出为10.25.16.19.4(在最后一个点之后,我们拥有的是端口)。 如果我们有localhost.42916,则预期输出为:-localhost 42916

捕捉点是:-只有最后一个点应替换为制表符,其余的应保留不变


谢谢。

我会用这个替代品:

s@\(.*\)\.@\1\t@

也就是说,捕获到最后一个点的所有内容,将其替换为自身加上一个选项卡。

使用线尾锚定$:

sed -e 's/\.\([0-9]+\)$/\t\1/'
“\1”是组1,它是捕获的端口

sed 's/\([a-zA-Z][^[:space:]]*\)\.\([0-9]\{1,3\}\)/\1   \2/g;s/\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)/\1 \3/g'
如果线上有IP5以外的东西,你可以使用这个。它不是防弹的(IP6,…),但应该在99%的情况下工作。Posix版本so
——GNU上的Posix

试试这个

sed 's/\(.*\)\.\(.*\)/\1\t\2/' file name
输入:

localhost.78 
tal.crack.9876
输出:

localhost   78 
tal.crack   9876

谢谢你的回复。我试过这个,但是这个没有把最后一个点和标签分开。我做错什么了吗sed's/([0-9]\{1,3\}.{3\}[0-9]\{1,3\}.([0-9]\{1,3\})/\1\2/g'test.out localhost.78 tal.crack.9876请提供一些样本行,以便我可以用您的数据进行测试。我在你的文本上测试(也是一个已经编辑过的小错误,这是
\3
而不是
\2
)嗨,我正在使用这个命令netstat | grep-e tcp-e udp | sed):l;s/(.*)\(.*)/\1\2/g;我希望在输出中,第4列和第5列(本地地址和外部地址)与端口(最后一个点之后的部分)分开。但是,这不起作用,并给出一个错误:-sed:标签:l;s/(.*)\(.*)/\1\2/g;tl大于八个字符。你知道这是怎么回事吗?是否有其他方法可以实现此目的?删除:l后面的空格,如果不够,则替换
以新行显示。在posix版本中,标签后面只有一个新行,其中GNU sed允许一个
我尝试了此操作,但现在出现了以下错误:-$netstat | grep-e tcp-e udp | sed::l>s/(.*)\.(.*)/\1\2/g>tl'sed:Function s/(.*)\.(.*)/\1\2/g无法解析。我尝试了此操作,但无效。我创建了一个文件“test.out”,其中包含两个条目:-localhost.78和tal.crack.9876,我希望输出为localhost 78和tal.crack 9876。但是当我用我的文件运行上面的sed时,我得到的输出像:-localhostt78 tal.crackt9876我做错了什么吗?输入是同一行还是分开的行?对我来说,它没有。我正在使用HP-UX。这会影响解析吗?您可以使用空格而不是
\t
。我认为\t不起作用。你可以使用这个空间。谢谢你,伙计。这起作用了。如果你能解释一下这个命令,让我理解,我将不胜感激——只要你有时间这样做。谢谢。尝试使用此命令时,我得到一个错误:-$sed-e's/\.([0-9]+)$/\t\1/'test.out sed:Function s/\.([0-9]+)$/\t\1/无法解析。您好,我正在使用此命令netstat | grep-e tcp-e udp | sed':l;s/(.*)\(.*)/\1\2/g;我希望在输出中,第4列和第5列(本地地址和外部地址)与端口(最后一个点之后的部分)分开。但是,这不起作用,并给出一个错误:-sed:标签:l;s/(.*)\(.*)/\1\2/g;tl大于八个字符。你知道这是怎么回事吗?还有其他方法可以实现这一点吗?嗨,我正在使用这个命令netstat | grep-e tcp-e udp | sed':l;s/(.*)\(.*)/\1\2/g;我希望在输出中,第4列和第5列(本地地址和外部地址)与端口(最后一个点之后的部分)分开。但是,这不起作用,并给出一个错误:-sed:标签:l;s/(.*)\(.*)/\1\2/g;tl大于八个字符。你知道这是怎么回事吗?还有其他方法可以实现这一点吗?@HappySingh:first,netstat打印像
address:port
而不是
address.port
。其次,你需要在你的
sed
命令中把
`放在
(`and
之前。嘿,约翰,不幸的是我在HP-UX上,而不是在Linux上。所以,它在linux上打印address.port,我的sed工作得很好,我很容易就能工作。现在,我需要在HP-UX上工作,即netstat上的sed应该将端口从本地和外部地址的ip地址中分离出来。正如我试图说的,但格式弄乱了,您必须退出您的参数,因此:
sed':l;s/\(.*)\.\(.*)/\1\2/g;tl'