从主文件中的值查找和替换文件

Posted

技术标签:

【中文标题】从主文件中的值查找和替换文件【英文标题】:Find and replace in file from values in master file 【发布时间】:2018-02-14 14:54:47 【问题描述】:

我想用另一个主文件中的查找值替换文件中的值

我目前正在使用以下命令来做到这一点

awk 'FNR==NR  array[$1]=$2; next   for (i in array) gsub(i, array[i]) 1' map.txt test1.txt

猫地图.txt

非空

猫测试.txt

字符集拉丁语不区分大小写不为空

结果:

CHARACTER SET LATIN NOT CASESPECIFIC NULL NULL

替换单个单词效果很好。

但是当我在引号内给出多个单词时说

猫地图.txt

'非空''空'

预期输出:

CHARACTER SET LATIN NOT CASESPECIFIC NULL

如果我必须替换多个组合的单词,它就不起作用了。

如有任何帮助,我们将不胜感激。

提前致谢。

【问题讨论】:

必须引用吗? map.txt 中的替换集是否都相等?这意味着有两个词作为一个词的索引。 edit 您的问题是使用 按钮正确格式化您的输入和输出,以便我们可以复制/粘贴来测试。 【参考方案1】:

因此,如果您可以在不引用单词的情况下生活,并且 map.txt 文件对于所有替换项看起来都相同,您可以执行以下操作:

aawk 'FNR==NR array[$1]=$2; next   for (i in array) gsub(i, array[i]) 1' FS=":" map.txt FS=" " test.txt

猫测试.txt

CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL

猫地图.txt

NOT NULL : NULL 

输出:

CHARACTER SET LATIN NOT CASESPECIFIC NULL

另一个:

猫测试.txt

CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL

猫地图.txt

SET LATIN NOT CASESPECIFIC NOT : NULL

输出:

CHARACTER  NULL NULL

您必须对地图文件进行调整,方法是将两个字段(替换目标、替换)分隔为:(或其他任何内容,只需在脚本中更改即可)。如果你这样做,它会使脚本保持低复杂度,但现在不管你想替换多少个单词都可以工作。

【讨论】:

这没有给我想要的输出。它所做的是将 'NOT' 替换为 'NULL' 。我需要的是用'NULL'替换'NOT NULL' 还有其他建议吗?我也尝试过使用引号,它不起作用。 嗯,这很奇怪。因此,如果使用发布的 test.txt 和 map.txt,它会将 NOT NULL 替换为 NULL。但不适用于引号。 当我按照您的建议或使用引号时,它不会将 NOT NULL 替换为 NULL。我所需要的只是将多个当前不起作用的单词一起替换。 嗯,所以构造 array[$1 FS $2]=$3; next 捕获 NOT NULL 作为值 NOT 的键。因此,当它在数组上循环时,它会在 test.txt 中看到 Key NOT NULL 并使用为 NULL 的值对其进行 gsubs。或者我在这里遗漏了一些东西......*抓挠我的头*

以上是关于从主文件中的值查找和替换文件的主要内容,如果未能解决你的问题,请参考以下文章

查找和替换元胞数组中的值

查找和替换文件中的单词/行

如何防止 SSMS 在“查找”文件中的查找和替换发生更改

递归查找和替换文件中的字符串,为受影响的文件创建备份

使用数组 VBA 查找和替换数据库中的值

根据文本文件的名称查找和替换文本文件中的单词