"name"이라는 단어가 여러 번(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