我有两个文件:一个文件包含需要在另一个文件中替换的 IP 列表。我的文件如下:
文件1.txt
173.43.24.67
170.34.24.59
172.83.47.83
160.28.39.49
文件2.txt
### HostList ##
[group]
dev ansible_host=pub_ip1 ansible_user=ubuntu
test ansible_host=pub_ip2 ansible_user=ubuntu
prod ansible_host=pub_ip3 ansible_user=ubuntu
uat ansible_host=pub_ip4 ansible_user=ubuntu
预期产出
### HostList ##
[group]
dev ansible_host=173.43.24.67 ansible_user=ubuntu
test ansible_host=170.34.24.59 ansible_user=ubuntu
prod ansible_host= 172.83.47.83 ansible_user=ubuntu
uat ansible_host=160.28.39.49 ansible_user=ubuntu
如果有人能帮助我实现上述目标,那就太好了。
答案1
您必须先删除 file2.txt 的前两行,然后:
$ paste file1.txt file2.txt | tr '=' ' ' | awk '{printf("%s %s=%s %s\n",$2,$3,$1,$5)}' | column -t
dev ansible_host=173.43.24.67 ansible_user
test ansible_host=170.34.24.59 ansible_user
prod ansible_host=172.83.47.83 ansible_user
uat ansible_host=160.28.39.49 ansible_user
答案2
这应该在任何地方都有效:
awk '
NR == FNR {m[NR]=$0}
NR != FNR && f {
sub(/=.*/, "=" m[NR-FNR], $2)
print
}
NR != FNR && !f {
print
if (/^[[]/) f = 1
}
' file1 file2
答案3
$ awk 'NR==FNR{ips[NR]=$1; next} FNR>2{sub(/=[^ ]+/,"="ips[FNR-2])} 1' file1.txt file2.txt
### HostList ##
[group]
dev ansible_host=173.43.24.67 ansible_user=ubuntu
test ansible_host=170.34.24.59 ansible_user=ubuntu
prod ansible_host=172.83.47.83 ansible_user=ubuntu
uat ansible_host=160.28.39.49 ansible_user=ubuntu
答案4
另一个基于第一个答案的 sed 。
paste <(sed -n '3,$p' file2.txt ) file1.txt |sed "s/\(^.*=\)\(pub_ip.\)\(.*\)\t\(.*\)/\1\4\3/"| cat <(head -2 file2.txt) -
输出:
### HostList ##
[group]
dev ansible_host=173.43.24.67 ansible_user=ubuntu
test ansible_host=170.34.24.59 ansible_user=ubuntu
prod ansible_host=172.83.47.83 ansible_user=ubuntu
uat ansible_host=160.28.39.49 ansible_user=ubuntu
编辑:
paste <(sed -n '3,$p' file2.txt ) file1.txt |sed "s/\(^.*=\)\(pub_ip[[:digit:]]*\)\(.*\)\t\(.*\)/\1\4\3/"| cat <(head -2 file2.txt) -
在 pub_ip 部分之后我们想要选择任何数字。
解释。
<(sed -n '3,$p' file2.txt )
我们从 file2 中删除了第一两行。粘贴命令将其与 file1 合并。
输出paste <(sed -n '3,$p' file2.txt ) file1.txt
:
dev ansible_host=pub_ip1 ansible_user=ubuntu 173.43.24.67
test ansible_host=pub_ip2 ansible_user=ubuntu 170.34.24.59
prod ansible_host=pub_ip3 ansible_user=ubuntu 172.83.47.83
uat ansible_host=pub_ip14 ansible_user=ubuntu 160.28.39.49
之后,我们将该文件中的行分为四个部分。
(dev ansible_host=) 1st
(pub_ip[digits]) 2nd
( ansible_user=ubuntu) 3rd (plus tab)
173.43.24.67 4th.
并打印第 1、4、3 部分。输出:
dev ansible_host=173.43.24.67 ansible_user=ubuntu
test ansible_host=170.34.24.59 ansible_user=ubuntu
prod ansible_host=172.83.47.83 ansible_user=ubuntu
uat ansible_host=160.28.39.49 ansible_user=ubuntu
=> 我们只需要将这个输出和 file2 中的前两行连接起来