使用 sed 从文件中删除别名

使用 sed 从文件中删除别名

我创建了一个 ping 扫描程序,将获取的 IP 保存到名为“hosts”的文件中。然后,我想从文件中删除我自己的 IP 地址,但不知道我的 IP 地址是什么,所以我尝试执行以下操作:

    alias ownip='hostname -I'
    sed ownip ./host

这不起作用,导致出现以下错误:

    sed: -e expression #1, char 1: unknown command: `o'

那么如何从文件中删除我自己的IP呢?

答案1

如果输入的“主机”文件只是一个每行都是一个 IP 地址的文件,并且您想要删除hostname -I该文件中输出的所有 IP 地址,请尝试以下操作:

sed -i "$(hostname -I | sed 's/\([.:[:xdigit:]]\{1,\}\)/\/\1\/d;/g')" ./host

主机名通过管道传输到的命令替换内部的 sed 只是将主机名输出的 IP 地址转换为外部 sed 的 sed 删除命令。 Sed 的i标志告诉 sed 覆盖您提供的文件。您可能希望首先在没有此标志的情况下运行它,以确保输出正确,或者给出i一个参数,告诉 sed 使用该参数作为后缀创建输入文件的备份,例如-i'~'将生成一个名为 的备份host~。如果您的 sed 版本没有此标志,您可以写入临时文件并覆盖原始文件:

sed "$(hostname -I | sed 's/\([.:[:xdigit:]]\{1,\}\)/\/\1\/d;/g')" ./host > /tmp/newhost && mv /tmp/newhost ./host

我认为i无论如何,这就是幕后的作用。

如果您确实想使用别名,请注意别名只是当它们是第一个命令词时进行文本替换在命令中,因此在原始示例中,您需要使用命令替换,即 $(ownip) 来为 sed 提供实际执行该别名的输出。您的错误消息意味着 sed 正在尝试使用“ownip”作为其脚本,在这种情况下会抱怨,因为 sed 没有“o”命令。

答案2

我用 :

ip a | grep inet | awk '{print $2}'

如果您不想使用本地地址,请使用额外的grep -v 127.

答案3

我会将您的别名稍微修改为trim空格,然后ownip也使用您的别名生成删除命令:

alias ownip='hostname -I | xargs'
sed -e "$(ownip | sed -e 's/[.]/[.]/g;s|.*|/&/d;|')" yourhostsfile

相关内容