shell 如何根据前面的搜索关键字搜索和替换IP:PORT格式的文本文件中的IP部分?

umuewwlo  于 2023-04-21  发布在  Shell
关注(0)|答案(2)|浏览(119)

在我的文件中,我的脚本需要搜索marker_strings,然后更新下一个具有IP:PORT的文本,而不更改其PORT值。
此外,格式要求仅在标记之前应用制表符空间,从而保留现有内容的其余部分。
以下是一个示例场景:

marker-a should use 600.0.0.100
marker-b should use 700.0.0.200

示例文件(之前)

some header
    some data here untouched
    server marker-a 100.0.0.10:11648 check
    server marker-b 100.0.0.11:11111 check
some header    
    some data here untouched
    server marker-a 100.0.0.10:11648 check
    server marker-b 100.0.0.11:11111 check

sample file(after)

some header
    some data here untouched
    server marker-a 600.0.0.100:11648 check
    server marker-b 700.0.0.200:11111 check
some header
    some data here untouched
    server marker-a 600.0.0.100:11648 check
    server marker-b 700.0.0.200:11111 check

我尝试了基于其他最接近这种情况的答案,发现这一点,但输出中没有任何变化。

sed -e '/^ *marker-a / s/ [^# ]/ 600.0.0.100/' input.txt
sed -e 's/^"marker-a" .*$/"marker-a 600.0.0.100"/' input.txt

下面来自@艾德Morton的解决方案基于我最初的帖子,没有格式要求。我在sub部分后插入print,但没有正确显示:

print "\t" $2 " " $3
$ cat tst.awk
BEGIN {
    mark2ip["marker-a"] = "600.0.0.100"
    mark2ip["marker-b"] = "700.0.0.200"
}
$2 in mark2ip {
    sub(/[^:]+/,mark2ip[$2],$3)
}
{ print }
jm81lzqq

jm81lzqq1#

使用任何awk:

$ cat tst.awk
BEGIN {
    mark2ip["marker-a"] = "600.0.0.100"
    mark2ip["marker-b"] = "700.0.0.200"
}
$2 in mark2ip {
    sub(/[^:]+/,mark2ip[$2],$3)
}
{ print }
$ awk -f tst.awk file
server marker-a 600.0.0.100:11648 check
server marker-b 700.0.0.200:11111 check
server marker-a 600.0.0.100:11648 check
server marker-b 700.0.0.200:11111 check

上面假设新的IP地址不包含& s(即反向引用元字符),这是合理的,因为它是一个IP地址。一般来说,对于任何字符都有效的替换,只需将sub(/[^:]+/,mark2ip[$2],$3)更改为sub(/[^:]+/,"",$3); $3=mark2ip[$2] $3

n8ghc7c1

n8ghc7c12#

您可以使用以下命令:

sed -E \
 -e 's/(marker-a[[:space:]]*)[^:]+/\1600.0.0.100/' \
 -e 's/(marker-b[[:space:]]*)[^:]+/\1700.0.0.200/' \
 input.txt

这里我们使用了两个类似的表达式:(marker-a[[:space:]]*)匹配marker和后面的空白符号到组\1中,稍后在替换中使用,[^:]+匹配后面的所有符号,直到:

相关问题