我需要在文本文件中搜索一个字符串,并进行替换,其中包含一个随着每次匹配而递增的数字。
要“找到”的字符串可以是单个字符、单词或短语。
替换表达式并不总是相同的(如下面的示例所示),但总是包含一个递增的数字(变量)。
例如:
1)我有一个名为“data.txt”的测试文件。该文件包含:
Now is the time
for all good men
to come to the
aid of their party.
2) 我将 awk 脚本放在名为“cmd.awk”的文件中。该文件包含:
/f/ {sub ("f","f(" ++j ")")}1
3)我像这样使用awk:
awk -f cmd.awk data.txt
在这种情况下,输出如预期:
Now is the time
f(1)or all good men
to come to the
aid of(2) their party.
当一条线上有多个匹配时,问题就来了。例如,如果我正在搜索字母“i”,例如:
/i/ {sub ("i","i(" ++j ")")}1
输出是:
Now i(1)s the time
for all good men
to come to the
ai(2)d of their party.
这是错误的,因为它不包括“时间”或“他们”中的“我”。
所以,我尝试了“gsub”而不是“sub”,比如:
/i/ {gsub ("i","i(" ++j ")")}1
输出是:
Now i(1)s the ti(1)me
for all good men
to come to the
ai(2)d of thei(2)r party.
现在它替换了所有出现的字母“i”,但插入的数字对于同一行上的所有匹配项都是相同的。
所需的输出应该是:
Now i(1)s the ti(2)me
for all good men
to come to the
ai(3)d of thei(4)r party.
注意:数字并不总是以“1”开头,所以我可能会像这样使用 awk:
awk -f cmd.awk -v j=26 data.txt
要获得输出:
Now i(27)s the ti(28)me
for all good men
to come to the
ai(29)d of thei(30)r party.
为了清楚起见,替换中的数字并不总是在括号内。并且替换并不总是包含匹配的字符串(实际上它非常罕见)。
我遇到的另一个问题是......
我想为“搜索字符串”使用 awk 变量(不是环境变量),所以我可以在 awk 命令行上指定它。
例如:
1) 我将 awk 脚本放在名为“cmd.awk”的文件中。该文件包含以下内容:
/??a??/ {gsub (a,a "(" ++j ")")}1
2)我会像这样使用awk:
awk -f cmd.awk -v a=i data.txt
要获得输出:
Now i(1)s the ti(2)me
for all good men
to come to the
ai(3)d of thei(4)r party.
这里的问题是,如何在 /search/ 表达式中表示变量“a”?