将单词实例替换为其附加的计数

将单词实例替换为其附加的计数

我有一个文件多次包含“名称”一词(250 次)。

我需要将“name”的每个实例替换为其附加的计数,如 name_1、name_2、name_3....name_250。

我可以使用 sed 来做到这一点吗?

我需要使用什么标志?

答案1

一份工作perl

perl -pe 's/\bname\b\K/"_".++$n/ge'

答案2

因为这涉及算术,所以这对于 来说不是一个好问题sed。但是,awk可以处理它:

awk '{for (i=1;i<=NF;i++) { if ($i=="name") {c++;$i=$i"_"c} }} 1'

例如:

$ echo  a name b name name c d name | awk '{for (i=1;i<=NF;i++) { if ($i=="name") {c++;$i=$i"_"c} }} 1'
a name_1 b name_2 name_3 c d name_4

解释:

  • {for (i=1;i<=NF;i++) { if ($i=="name") {c++;$i=$i"_"c} }}

    for循环迭代输入中找到的每个单词。如果该字是name,则计数器变量c递增,并将其值附加到该字。

  • 1

    在该awk语言中,这种神秘的简写意味着打印整行。

作为副作用,无关的空白将被删除。这包括每行上的前导和尾随空格,并且字间空格被减少为单个空格。

答案3

在简单的 Bash 脚本中

#!/bin/bash
count=0
search="linux"

while read line
do
      for word in ${line}
      do
           if [[ $word == $search ]]
           then
                printf "${word}_${count} "
                ((count++))
           else 
                printf "$word "
           fi
      done
      echo 
done < input_file

相关内容