![文件包含命令列表,其中每个命令都有一个需要用变量中的字符串替换的字符串](https://linux22.com/image/171776/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E5%91%BD%E4%BB%A4%E5%88%97%E8%A1%A8%EF%BC%8C%E5%85%B6%E4%B8%AD%E6%AF%8F%E4%B8%AA%E5%91%BD%E4%BB%A4%E9%83%BD%E6%9C%89%E4%B8%80%E4%B8%AA%E9%9C%80%E8%A6%81%E7%94%A8%E5%8F%98%E9%87%8F%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%9B%BF%E6%8D%A2%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我想将两个文件作为参数传递给我的脚本。
文件1.txt包含:
host1
host2
host3
文件2.txt包含:
command1 host_name morestuff
command2 host_name mnorestuff
如何从 File1 中提取每个项目并将每个项目替换为 File2 中的匹配“host_name”,以便获得输出:
command1 host1 morestuff
command2 host1 mnorestuff
command1 host2 morestuff
command2 host2 morestuff
command2 host3 morestuff
command2 host3 morestuff
答案1
创建一个awk
脚本,依次读取两个文件并进行替换:
awk 'FNR == NR { cmd[++n] = $0; next }
{
for (i = 1; i <= n; ++i) {
command = cmd[i]
sub("host_name", $0, command)
print command
}
}' File2.txt File1.txt
这会将命令读取到File2.txt
名为 的数组中cmd
。读取时File1.txt
,host_name
每个命令中的字符串都会替换为从文件中读取的主机名,并打印修改后的命令。
考虑到问题中的数据,结果将是
command1 host1 morestuff
command2 host1 mnorestuff
command1 host2 morestuff
command2 host2 mnorestuff
command1 host3 morestuff
command2 host3 mnorestuff
答案2
#!/bin/bash
while read reptext; do
sed -e "s/host_name/$reptext/" $2
done < $1
应该是自我解释。如果您需要更多信息,请告诉我。
编辑:根据 Kusalananda 的有效评论。