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

nag*_*nag 4 perl awk sed

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

我的文件数据:

:account_id:12345:6789:Melbourne:Aus
:account_id:98765:43210:Adelaide:Aus
Run Code Online (Sandbox Code Playgroud)

我的输出数据:

:account_id:123456789MelbourneAus
:account_id:9876543210AdelaideAus
Run Code Online (Sandbox Code Playgroud)

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

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

Aks*_*gde 8

另一种方法使用 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 
Run Code Online (Sandbox Code Playgroud)
$ 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

Run Code Online (Sandbox Code Playgroud)


Rav*_*h13 6

使用 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
Run Code Online (Sandbox Code Playgroud)