在我的文件中,我的脚本需要搜索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 }
2条答案
按热度按时间jm81lzqq1#
使用任何awk:
上面假设新的IP地址不包含
&
s(即反向引用元字符),这是合理的,因为它是一个IP地址。一般来说,对于任何字符都有效的替换,只需将sub(/[^:]+/,mark2ip[$2],$3)
更改为sub(/[^:]+/,"",$3); $3=mark2ip[$2] $3
。n8ghc7c12#
您可以使用以下命令:
这里我们使用了两个类似的表达式:
(marker-a[[:space:]]*)
匹配marker和后面的空白符号到组\1
中,稍后在替换中使用,[^:]+
匹配后面的所有符号,直到:
。