提问人:mbur_1 提问时间:10/11/2021 最后编辑:mbur_1 更新时间:10/11/2021 访问量:243
awk - 在多个文件中查找第 1 列中的字符串并将其替换为第 2 列中的字符串
awk - Find and replace string from column 1 with string from column 2 in multiple files
问:
我有一个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赞
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
你使用什么版本?如果你把整个程序放在一行上,你会看到同样的情况吗?awk
awk
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
评论
<title>