替换perl中一行中第n次出现后的所有出现

我需要在 Unix 文件的每一行中第 n 次出现后替换所有出现的字符串。

我的文件数据:

:account_id:12345:6789:Melbourne:Aus
:account_id:98765:43210:Adelaide:Aus

我的输出数据:

:account_id:123456789MelbourneAus
:account_id:9876543210AdelaideAus

尝试使用 sed: sed 's/://3g' test.txt

不幸的是,g出现这种情况的选项没有按预期工作。相反,它正在替换所有出现的情况。

回答

另一种方法使用 awk

awk -v c=':' -v n=2 'BEGIN{
                       FS=OFS=""
                     }
                     {
                       j=0;
                       for(i=0; ++i<=NF;)
                         if($i==c && j++>=n)$i=""
                     }1' file 
$ cat file 
:account_id:12345:6789:Melbourne:Aus
:account_id:98765:43210:Adelaide:Aus

$ awk -v c=':' -v n=2 'BEGIN{FS=OFS=""}{j=0;for(i=0; ++i<=NF;)if($i==c && j++>=n)$i=""}1' file 
:account_id:123456789MelbourneAus
:account_id:9876543210AdelaideAus


回答

使用 GNU awkgensub请尝试以下操作。这完全基于您显示的示例,其中 OP 希望:从第 3 次出现开始删除。利用gensub到匹配的值的偏析部分以及从第二部分中的所有冒号(从起第三结肠),按照OP的要求。

awk -v regex="^([^:]*:)([^:]*:)(.*)" '
{
  firstPart=restPart=""
  firstPart=gensub(regex, "1 2", "1", $0)
  restPart=gensub(regex,"3","1",$0)
  gsub(/:/,"",restPart)
  print firstPart restPart
}
' Input_file


以上是替换perl中一行中第n次出现后的所有出现的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>