sed를 사용하여 변수가 있는 파일의 줄 편집

sed를 사용하여 변수가 있는 파일의 줄 편집

를 사용하여 파일의 한 줄을 편집해야 합니다 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  

바라보다:언제 sed를 사용하지 말아야 합니까?

관련 정보