【问题标题】:replace content of a file from content of another file based on condition in unix根据unix中的条件从另一个文件的内容中替换一个文件的内容
【发布时间】:2017-09-04 22:20:07
【问题描述】:

我有两个文件
文件1内容:

<tag element="abc">
<util:cons path="com.rmn.STRING">
</tag>
<tag element="xyz">
<util:cons path="com.rmn.FLOAT">
</tag>

File2 内容(两个空格分隔的列):

JAVA CHARACTER
PYTHON INT

期望的输出是从 file2 替换 file1 中的字符串。

<tag element="JAVA"> //replace string abc by JAVA
<util:cons path="com.rmn.CHARACTER"> //replace string STRING with CHARACTER
</tag>
<tag element="PYTHON"> //replace string xyz by PYTHON
<util:cons path="com.rmn.INT"> //replace string FLOAT by INT
</tag>

我不确定在这种情况下如何使用 sed 或 awk。

【问题讨论】:

  • 你看过m4吗? 7th Edition Documentation 中有一些旧文档。此外,Gnu m4 有很多扩展。这不是你问的问题,但很高兴知道你是否会做很多这样的事情。

标签: shell unix awk sed


【解决方案1】:

sed 用于简单的 s/old/new/ 操作,仅此而已。你不只是在做 s/old/new/ 所以你不应该考虑使用 sed。只需使用 awk:

$ cat tst.awk
NR==FNR {
    tag[NR]  = $1
    util[NR] = $2
    next
}
/<tag/  { sub(/"[^"]+"/,"\""tag[++cnt]"\"") }
/<util/ { sub(/\.[^."]+"/,"."util[cnt]"\"") }
{ print }

$ awk -f tst.awk file2 file1
<tag element="JAVA">
<util:cons path="com.rmn.CHARACTER">
</tag>
<tag element="PYTHON">
<util:cons path="com.rmn.INT">
</tag>

如果 file2 中的 $2 值可以包含反向引用(即&amp;),上述操作将失败。如果这是一个问题,请更新您的问题以包含该问题。

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2014-03-15
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多