Replace 使用awk替换文件中出现的第n个字符,而不考虑行

Replace 使用awk替换文件中出现的第n个字符,而不考虑行,replace,awk,Replace,Awk,我正在尝试替换第n次出现的字符或字符串,而不考虑使用awk的行 如果我们的数据是这样的 ||||||| |||||| ||||| ||| 我们试图用一个 那么输出应该是这样的,假设我们想每三次替换一次 ||A||A| |A||A| |A||A ||A 我当前使用的awk命令如下 awk '/|/{c++;if(c==3){sub(/|/,"A");c=0}}1' test.data 它错误地输出了这个 ||||||| |||||| A|||| ||| 数据也可以是这样的 |||xfsa

我正在尝试替换第n次出现的字符或字符串,而不考虑使用awk的行

如果我们的数据是这样的

|||||||
||||||
|||||
|||
我们试图用一个

那么输出应该是这样的,假设我们想每三次替换一次

||A||A|
|A||A|
|A||A
||A
我当前使用的awk命令如下

 awk '/|/{c++;if(c==3){sub(/|/,"A");c=0}}1' test.data
它错误地输出了这个

|||||||
||||||
A||||
|||
数据也可以是这样的

|||xfsafrwe|||asfasdf|
|safasf|||asfasdf||
||asfasf|||
|||
结果当然是这样

||Axfsafrwe||Aasfasdf|
|safasfA||asfasdfA|
|Aasfasf||A
||A
感谢GNU awk:

awk '{
  for (i = 0; ++i <= NF;)
    ++c % n || $i = v 
  }1' OFS= FS= n=3 v=A infile
awk'{

对于(i=0;++i,它适用于我上面给出的第一种情况,但它不是正确的解决方案。我需要替换像“|”这样的字符串的第n次出现。我在上面给出了另一个示例。@ppone,我添加了一个新版本。awk'{c=0;用于(i=0;++i根据你的解决方案,我想出了上述方法。但你已经用一个更简洁的方法击败了我。:)
awk '{
  for (i = 0; ++i <=NF;)
    if ($i == o)
      ++C % c || $i = n 
  } 1' FS= OFS= c=3 o=\| n=A infile