GREP; 1.使用文件作为输入2.附加到每个匹配

时间:2015-03-30 17:19:40

标签: unix awk sed grep

寻找匹配并附加到linux / unix中匹配。也许是sed / awk

cat Data.txt

 RMS_QUANTITY_RT
 SMS_QUANTITY_RT

file.xml

 <!-- dec=664, SMS_QUANTITY_RT -->
 <!-- dec=664, RMS_QUANTITY_RT -->

预计结果

 <!-- dec=664, SMS_QUANTITY_RT OK TO REMOVE -->
 <!-- dec=664, RMS_QUANTITY_RT OK TO REMOVE-->
grep -f Data.txt file.xml | NOT SURE how to do this part

2 个答案:

答案 0 :(得分:1)

您可以使用sed替换一步完成所有操作。

sed 's/RMS_QUANTITY_RT\|SMS_QUANTITY_RT/& OK TO REMOVE/g'

我刚刚接受了两个搜索字词,并将它们作为&#39; OR&#39; sed替换命令中的正则表达式。如果您有大量字符串,则可能更容易将列表放入sed命令列表中,并使用-f标志让sed从文件中读取脚本。

这里是如何工作的 - 在sed的正则表达式替换中,&是一个特殊的字符,它返回正则表达式的匹配字符串,所以我们的sed说匹配要么&#34; RMS_QUANTITY_RT&#34;或&#34; SMS_QUANTITY_RT&#34;然后将其替换为匹配的任何内容和静态字符串&#34;可以删除&#34;。

提供此示例输入:

$ cat xml.test
<!-- dec=664, SMS_QUANTITY_RT -->
<bad tag>
value value
</bad tag>
 <!-- dec=664, RMS_QUANTITY_RT -->
<bad tag>
value value
</bad tag>

我们看到此输出运行命令:

$ sed 's/RMS_QUANTITY_RT\|SMS_QUANTITY_RT/& OK TO REMOVE/g' xml.test
<!-- dec=664, SMS_QUANTITY_RT OK TO REMOVE -->
<bad tag>
value value
</bad tag>
 <!-- dec=664, RMS_QUANTITY_RT OK TO REMOVE -->
<bad tag>
value value
</bad tag>

修改它然后从文件中读取并编辑XML,我们使用一个简单的循环来读取文件行,然后执行sed -i来替换它:

while read n; do sed -i "s/$n/& OK TO REMOVE/g" file.xml; done < Data.txt

在这里你可以看到这个工作:

$ cat file.xml
<!-- dec=664, SMS_QUANTITY_RT -->
<bad tag>
value value
</bad tag>
 <!-- dec=664, RMS_QUANTITY_RT -->
<bad tag>
value value
</bad tag>

DATA.TXT:

$ cat Data.txt
RMS_QUANTITY_RT
SMS_QUANTITY_RT

运行代码后的file.xml内容:

$ while read n; do sed -i "s/$n/& OK TO REMOVE/g" file.xml; done < Data.txt
$ cat file.xml
<!-- dec=664, SMS_QUANTITY_RT OK TO REMOVE -->
<bad tag>
value value
</bad tag>
 <!-- dec=664, RMS_QUANTITY_RT OK TO REMOVE -->
<bad tag>
value value
</bad tag>

答案 1 :(得分:1)

这适用于您的示例输入:

awk '
    NR==FNR {ok[$1]=1; next} 
    $(NF-1) in ok {$NF = "OK TO REMOVE " $NF} 
    1
' Data.txt file.xml

第一行将Data.txt的内容存储在ok数组的键中 如果在数组键中找到第二个最后一个字段,则第二行添加文本 第三行打印file.xml中的每一行