我有一个文件多次包含“名称”一词(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