【发布时间】:2014-02-16 12:13:55
【问题描述】:
使用 bash,我试图用 sed 替换存储变量中的多行,然后使用行更改打印变量。
列表变量如下所示 - virtmx 元素都是唯一的 - 不重复
$list 变量:
domain1.com =====> dest.domain.com:25
domain2.com =====> virtmx-0050:25
domain3.com =====> dest.domain2.com:25
domain4.com =====> domain.example.com:25
domain5.com =====> dest.domain3.com:25
domain6.com =====> virtmx-0051:25
domain7.com =====> dest.domain4.com:25
domain8.com =====> dest.domain5.com:25
domain9.com =====> dest.domain6.com:25
我想用系统文件中的另一行替换所有 virtmx-[num]。
somefile.log 同时包含 line[num] 和替换行:
file.log 中的行示例:
cat /somedir/somefile.log | grep virtmx-*
<mta id="50" host="virtmx-0050:25" dns_type="MX" desc="mxgroupname">
<mta id="51" host="virtmx-0051:25" dns_type="MX" desc="mxgroupname2">
使用 awk 提取行的示例:
cat /somedir/file.log | grep virtmx-0050 | awk -F "\"" '{print $4,$8}'
virtmx-0050:25 mxgroupname
virtmx-0051:25 mxgroupname2
想要的输出:
domain1.com =====> dest.domain.com:25
domain2.com =====> mxgroupname
domain3.com =====> dest.domain2.com:25
domain4.com =====> domain.example.com:25
domain5.com =====> dest.domain3.com:25
domain6.com =====> mxgroupname2
domain7.com =====> dest.domain4.com:25
domain8.com =====> dest.domain5.com:25
domain9.com =====> dest.domain6.com:25
$listoflines 只包含行本身:
line1
line2
我正在使用 awk 提取行,然后创建一个 sed 替换字符串 - 我用它来替换 $output 变量中的条目:
line1/replacement1
我想我已经接近了,但下面的代码只是替换循环中的第一个实例,然后重新开始并用新的替换再次打印整个变量,但缺少第一个。相反,我想用所有替换打印整个变量一次。替换的数量可能会有所不同,这就是我尝试使用 for 循环的原因。
for i in $listoflines
do
replace=`cat /dir/somemfile.log | grep $i | awk -F "\"" '{print $4,$8}' | sed 's/ /\//'`
echo "$list" | sed 's/'$replace'/'
done
【问题讨论】:
-
somefile.log 的第二行是否有
line2?另外,您为什么要在"而不是空格上拆分文件。此外,您几乎肯定需要在这里逐行读取变量,您总是会错误地打印您的$output行两次。 -
你能放一些来自
somefile.log的示例行吗? -
@anubhava 我从 somefile.log 添加了一些示例。
标签: string bash replace sed awk