awk, 변수가 있는 awk, 파일

awk, 변수가 있는 awk, 파일

일부 파일을 다음과 같이 수정하려고 합니다.

  • awk 문을 사용하여 주어진 단어를 다른 단어로 바꿉니다.
  • awk에서는 두 단어 모두 변수여야 합니다.

이와 같은 것을 시도했지만 코드가 제대로 작동하지 않습니다.

read word                                 
read replace                     
while read file                         
do     
   if [[ -f $file ]]           
       then       
       awk -v cuv1="$word" -v cuv2="$replace" '{gsub(/cuv1/,"cuv2")}' "$file"   
   else   
       echo "File does not exist"   
   fi     
done    

어떻게 해야 하나요?

답변1

당신이 가진 기본적인 오류는 gsub(/cuv1/, "cuv2")변수를 찾지 않고 변수를 찾는 것입니다. cuv1로 교체하세요 cuv2. 변수를 사용하려면 다음을 원합니다.

gsub(cuv1,cuv2);

다음 문제는 실제로 awk아무것도 인쇄하라고 지시하지 않는다는 것입니다. awk식이 true로 평가될 때 의 기본 동작은 행을 인쇄하는 것이므로 위의 수정 사항을 사용하여 명령은 대체가 작동한 모든 행을 인쇄하지만 다른 것은 인쇄하지 않습니다.

마지막으로 awk가 원본 파일 위에 변경 사항을 적용할 것으로 기대하는 것 같습니다. 이를 위해서는 GNU awk(gawk) 확장이 필요합니다 -i inplace. 그러나 이는 상대적으로 새롭고 이식성이 없습니다. 모든 시스템에서 작동하지는 않습니다. 이 모든 것을 종합하면 다음과 같습니다(GNU awk 가정).

awk -i inplace  -v cuv1="$word" -v cuv2="$replace" '{gsub(cuv1,cuv2); print;}' "$file"

sed및 다음 을 사용하는 더 간단한 솔루션 perl:

sed -i "s/$word/$replace/g" "$file"
perl -i -pe "s/$word/$replace/g" "$file"

관련 정보