Um trabalho para perl
:
perl -pe 's/\bname\b\K/"_".++$n/ge'
Eu tenho um arquivo que contém a palavra 'name' várias vezes (250 vezes).
Eu preciso substituir cada instância de 'name' por sua contagem anexada a ele como name_1, name_2, name_3 .... name_250.
Posso fazer isso usando sed?
Quais sinalizadores eu preciso usar?
Como isso envolve aritmética, isso não é um bom problema para sed
. No entanto, awk
pode lidar com isso:
awk '{for (i=1;i<=NF;i++) { if ($i=="name") {c++;$i=$i"_"c} }} 1'
Por exemplo:
$ 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} }}
Esse loop for
itera sobre cada palavra encontrada na entrada. Se a palavra for name
, a variável do contador c
será incrementada e seu valor será anexado à palavra.
1
Na linguagem awk
, essa abreviação oculta significa imprimir toda a linha.
Como efeito colateral, o espaço branco estranho será removido. Isso inclui espaços em branco à esquerda e à direita em cada linha e espaços entre palavras são reduzidos a um único espaço em branco.
No script simples de 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
Tags text-processing sed