awk - 在多个文件中查找第 1 列中的字符串并将其替换为第 2 列中的字符串

awk - Find and replace string from column 1 with string from column 2 in multiple files

提问人:mbur_1 提问时间:10/11/2021 最后编辑:mbur_1 更新时间:10/11/2021 访问量:243

问:

我有一个txt文件(strings.txt),其中包含几组字符串(每行两个),由空白分隔:

String1 String1_new

String2 String2_new

...

然后我有几个 xml 文件,其中包含第 1 列中的字符串(String1、String 2...)。我想用_new版本替换给定的字符串。我想我可以用awk来做到这一点:搜索文件中第一列的任何字符串,如果找到:替换相应的_new字符串,转到下一个文件并重复。 我对awk以及如何构建它不太熟悉。谁能帮忙?我发现这是一个初始代码,我知道它非常不完整,但也许有人可以完成它?任何帮助都值得赞赏:

 awk -i inplace '
    NR == FNR { map[NR]=$2 }
    NR != FNR { sub(/ /,map[ARGIND]) }
    1' strings.txt ?.xml

要处理的 xml 文件中的示例,例如 File1.xml:

<reference id="referenceTemplate">
  <title>String1</title> 
  </reference>

输出示例,例如。文件1.xml:

<reference id="referenceTemplate">
  <title>String1_new</title> 
  </reference>
哎呀呀

评论

0赞 James Brown 10/11/2021
请发布适当的示例数据以及相关的预期输出。不要将它们作为评论、图像、表格或指向非现场服务的链接发布,而是使用文本并将它们包含在您的原始问题中。谢谢。
0赞 mbur_1 10/11/2021
@JamesBrown对不起,希望这很好!
0赞 Renaud Pacalet 10/11/2021
缺少一条重要信息:要替换的字符串位于 XML 文件中的什么位置?任何地方,甚至在标签名称或属性中?仅作为标签的内容?其他?<title>
0赞 mbur_1 10/11/2021
@RenaudPacalet谢谢,雷诺。以下是字符串的位置:<image href=“../figures/filename1.png“ id=”id_xxx_yyy_zzz“/>
0赞 mbur_1 10/11/2021
@RenaudPacalet 重要提示:要替换的字符串为:href=“../figures/filename1.png”

答:

0赞 Renaud Pacalet 10/11/2021 #1

您没有指定在 XML 文件中可以找到要替换的字符串的位置。所以,让我们假设它在任何地方。如果您支持关联数组,它们可能是最简单的方法:awk

awk 'NR == FNR {
       map[$1] = $2
       next
     }
     {
       for(s in map)
         gsub(s, map[s])
     }
     1
' strings.txt *.xml

注意:循环强制字符串之间的顺序进行替换。而且您无法控制订单。但是,顺序可能很重要,例如,如果您的某些字符串是其他字符串的子字符串。如果是这种情况,请使用索引数组而不是关联数组:for

awk 'BEGIN {
       n = 0
     }
     NR == FNR {
       str[n] = $1
       map[n++] = $2
       next
     }
     {
       for(i=0; i<n; i++)
         gsub(str[i], map[i])
     }
     1
' strings.txt *.xml

注意:要就地进行替换,如果要保留文件,则必须小心并在不修改的情况下打印它,而不是根本不打印任何内容。否则它将被清空。关联数组示例:strings.txt

awk -i inplace 'NR == FNR {
       map[$1] = $2
       print
       next
     }
     {
       for(s in map)
         gsub(s, map[s])
     }
     1
' strings.txt *.xml

评论

0赞 mbur_1 10/11/2021
我已经测试了所有代码,但出现“^ unterminated string”错误
0赞 Renaud Pacalet 10/11/2021
难道您跳过了每个代码片段最后一行的前导单引号吗?
0赞 mbur_1 10/11/2021
我没有跳过它们。我什至尝试用双引号替换它们(我在窗口下工作并阅读单引号必须替换为双引号。当我使用单引号标记时,我得到“^ invalid char ''' in expression”
0赞 Renaud Pacalet 10/11/2021
你使用什么版本?如果你把整个程序放在一行上,你会看到同样的情况吗?awkawk
0赞 mbur_1 10/12/2021
我已经安装了 gawk-3.1.6-1-setup,我已经在一行中尝试了所有方法:但这次它给了我一个“^ 语法错误”awk -i inplace "NR == FNR { map[$1] = $2 print next } { for(s in map) gsub(s, map[s]) } 1 " strings.txt *.xml