【发布时间】:2021-10-12 13:33:12
【问题描述】:
我有一个如下所示的source.txt 文件,其中包含两列数据。 source.txt的列格式包括[](方括号)如我的source.txt所示:
[hot] [water]
[16] [boots and, juice]
我还有另一个 target.txt 文件,其中包含空行以及每行末尾的句号:
the weather is today (foo) but we still have (bar).
= (
the next bus leaves at (foo) pm, we can't forget to take the (bar).
我想用source.txt的第一列的“相应内容”替换target.txt的每n行的foo,并替换每nth的bar target.txt 的行与source. txt 的第二列 的“相应内容”。
我试图搜索其他来源并了解我将如何做到这一点,起初我已经有一个用于替换 "replace each nth occurrence of 'foo' by numerically respective nth line of a supplied file" 的命令,但我无法适应它:
awk 'NR==FNR {a[NR]=$0; next} /foo/{gsub("foo", a[++i])} 1' source.txt target.txt > output.txt;
我记得看到过一种使用 gsub 包含两列数据的方法,但我不记得具体有什么区别。
编辑帖子:有时会在 target.txt 文本中读取 = 和 ( 和 ) 之间的一些符号。我添加了这个符号,因为如果这些符号在 target.txt 文件中,某些答案将不起作用
注意:target.txt 的行数以及 bar 和 foo 在此文件中的出现次数可能会有所不同,我只是展示了一个示例。但是foo和bar在每一行中出现的次数分别为1。
【问题讨论】:
-
您的意思是要将第 n 行源代码替换为第 n 行目标代码吗?您的示例在源代码中有 2 行,但在目标中有 3 行。
-
所以你的意思是第一行的预期结果是“今天天气热但我们还有水” i> 第二个“下一班车在16 pm出发,我们不能忘记带上靴子和果汁”?
-
为此,您只需要两个数组。如果行号应该始终匹配,您可以使用
FNR而不是i++。 -
可能edit您的问题是为了澄清要求。
-
@7beggars_nnnnm,单行中是否可以有多个 foo、bar 的实例?或者它们总是与源文件中的每一行相同?
标签: string awk replace gsub text-processing