다음과 같은 일부 파일을 수정하려고 합니다.
- 주어진 단어를 다른 단어로 바꾸려면 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"