를 사용하여 파일의 한 줄을 편집해야 합니다 sed
. 이제 문제는 특정 패턴을 텍스트와 숫자의 조합으로 대체한다는 것입니다. 이 숫자는 각 후속 행마다 계속 증가하는 변수입니다. 이제 sed
명령이 모든 라인에 대해 동시에 실행되면 발견된 패턴이 텍스트와 고정 숫자(예: 숫자의 초기 값)로 대체됩니다.
예를 들어:
k = 10
sed "s/raj/ram${k++}/"
답변1
파일이 매우 작은 경우 다음이 작동할 수 있습니다.
#!/bin/bash
for n in {1..40}
do
sed -i $n's/raj/ram'$n'/' file
done
파일을 40번 반복하고 항상 한 줄만 바꿉니다. 줄 번호가 아닌 변경된 줄 수로 카운터를 늘리려면 2개의 변수를 사용하여 다른 방식으로 수행해야 하지만 sed 명령은 다음과 같습니다. n은 루프에 의해 설정되지 않습니다.
sed -i는 파일을 그 자리에서 변경하므로 원본 파일을 유지하려면 먼저 복사본을 만들어야 합니다.
원하는 경우 oneliner로 수행할 수 있습니다.
for n in {1..40}; do sed -i $n's/raj/ram '$n'/' file ; done
자동으로 40을 선택하는 것이 아니라 정확한 사이즈를 선택하는 것도 가능합니다.
답변2
awk -v n=10 '{sub(/raj/, "ram" n); print; n++}'
답변3
가끔은 그것을 사용해야 할 때도 있고 sed
, 때로는 사용하지 않을 때도 있습니다. 내장된 산술 연산이 없으므로 다른 것을 사용하세요
. for 루프 없이 sed를 해킹하여 이 작업을 수행할 수 있지만 더 적합한 것을 사용하는 것에 비하면 의미가 없으며 단지 혼란스러운 어셈블리일 뿐입니다. sed
다음 입력 데이터를 사용하십시오.
printf '%s\n' 'a.raj' 'yyy' 'zzz' 'b.raj c.raj' >file
num=10 # start with this value
이것은 증가하는 Perl 방법입니다.모든발생 raj
(각 일치하는 줄이 두 번 이상 발생)
perl -pe 'BEGIN{ $num='$((num-1))' }
s/raj/ram.($num+=1)/ge' file
산출:
a.ram10
yyy
zzz
b.ram11 c.ram12
이건 또 다른 거야진주버전, 증분 raj
버전만일치하는 줄마다 한 번씩(즉, 동일한 숫자 접미사를 사용하여 동일한 행에 여러 일치 항목이 있음)
perl -pe 'BEGIN{ $num='$num' }
if(/raj/){ s/raj/ram.$num/ge; $num+=1 }' file
산출:
a.ram10
yyy
zzz
b.ram11 c.ram11