Linux 如何替换文本文件特定行中的未知IP地址

Linux 如何替换文本文件特定行中的未知IP地址,linux,sed,Linux,Sed,如何将此sed命令应用于文本文件中的特定行而不是整个文件 我在这里找到了一个解决方案,可以用特定地址替换文件中的任何IP地址。我需要将此命令应用于文件中的特定行,以便它只替换一个未知的IP地址。我看到sed使用-n进行过滤,但我确实不知道如何应用它来实现我的目标 此代码适用于文件中的每个IP: sed -e 's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/x.x.x.x/g' test.txt 如何将其应用于文件中唯一包含字符

如何将此sed命令应用于文本文件中的特定行而不是整个文件

我在这里找到了一个解决方案,可以用特定地址替换文件中的任何IP地址。我需要将此命令应用于文件中的特定行,以便它只替换一个未知的IP地址。我看到sed使用-n进行过滤,但我确实不知道如何应用它来实现我的目标

此代码适用于文件中的每个IP:

sed -e 's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/x.x.x.x/g' test.txt
如何将其应用于文件中唯一包含字符串“ipv4”的行,以使包含IP地址的其他行保持不变?

对于,您可以使用正则表达式,如下所示:

sed -re '/ipv4/s/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/x.x.x.x/g' test.txt
如果未指定
-r
,则需要对大括号进行转义,即:

sed -e '/ipv4/s/[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}/x.x.x.x/g' test.txt

您可以跳过不感兴趣的行:

sed '/ipv4/!b;s/YOUR PATTERN HERE/YOUR IP HERE/' input

如果我答对了,您希望在同样包含
ipv4
的行中找到ip地址的第一个匹配项,并跳过所有其他匹配项

使用GNU,尝试

-E
将启用POSIX ERE语法,无需转义
{}
()
-i
将直接替换文件中的内联
/ipv4/
将找到一行上有
ipv4
,然后
{s/[0-9]{1,3}(\.[0-9]{1,3}){3}/x.x.x/g;T;:a;n;ba}
将仅在该行上进行替换。看

如果您有POSIX
sed
,请尝试

sed -e '/ipv4/ {' -e 's/[0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}/x.x.x.x/g' -e ':a' -e n -e 'ba' -e '}' file > newfile

-n
标志将抑制输出。通常它与'p'命令一起用于打印特定行。显而易见,这只适用于IPv4地址。它为IPv6地址中断。您的问题包括一个简洁、可测试的示例输入和预期输出,以获得最佳帮助。谢谢。因此,在命令开头添加/ipv4/只会替换包含字符串ipv4的一行上的IP?全文是:“bind-address-ipv4”:“x.x.x.x”,@DocCaliban!只需调整此模式以满足您的需求need@DocCaliban那对你有用吗?你是否使用
-e
-e
-r
?这对我不起作用。如果省略/ipv4/则使用-e,整个命令通过更改文件中的所有IP地址来工作。仍然试图只瞄准这一行。@DocCaliban:很抱歉错过了那一行。您需要指定
-r
标志才能使用扩展正则表达式。或者,你需要摆脱牙套。谢谢!当我尝试时,我得到了一个未终止的{错误,但我看不出代码中有问题。@DocCaliban有趣的是,我只是使用了这段代码,它看起来很有效,即它替换了一行中第一个出现的IP,该行具有
ipv4
子字符串。您是否使用了GNU?您是否使用了变量?@DocCaliban正如Wiktor所指出的那样,代码没有导致错误,请注意检查您的代码。如果可能,请共享您正在使用的确切代码。您好。我必须使用的是一个不合作的sed版本。这是我的QNAP NAS附带的任何版本。@DocCaliban抱歉,不知道那里使用的是什么版本的
sed
。请尝试以下两种方法:1)
sed'/ipv4/{s/[0-9]\{1,3\(\.[0-9]\{1,3\})/x.x.x/g;T;:a;n;ba}(2)1,3)3(0-9)3(1,3(3)3(3)3(1,3)3(3)3(0-9)3(1,3)3(1,3)3(3)3(0-9)3(0-9)3(3)3(3)3)3(x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x(g'-e T-e-e-e-T-T-e-e-e-e-T-T-e-T-e-e(T-e:e:e:e:e:e:a-e:a-e:a-e-e-e:a-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e“a-e“e”e“e”e”精度稍低,但似乎在POSIX模式下工作。
sed -e '/ipv4/ {' -e 's/[0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}/x.x.x.x/g' -e ':a' -e n -e 'ba' -e '}' file > newfile