다음 스크립트에 문제가 있습니다(이 부분이 관련 부분입니다).
#!/bin/bash
OLD=(
"_MAIN1_"
"_MAIN2_"
)
NEW=(
"#111"
"#222"
)
length=${#OLD[*]}
i=0
while (( i < length ))
do
sed -e "s/${OLD[$i]}/${NEW[$i]}/g" oldfile.txt > newfile.txt
#sed -e 's/_MAIN1_/#111/g' oldfile.txt > newfile.txt # this works
# Another way that does not work
#sed -e 's/'"${OLD[$i]}"'/'"${NEW[$i]}"'/g' oldfile.txt > newfile.txt
((i++))
done
exit 0
내 목표는 파일의 문자열을 바꾸고 새 파일에 저장하는 것입니다. "이전" 및 "새" 문자열은 배열에 저장됩니다.
나는 많은 것을 시도하고 작은따옴표와 큰따옴표를 사용했지만 아무것도 작동하지 않습니다. 변수를 입력 하면 echo
루프 내부에 올바른 문자열이 표시됩니다. 두 문자열이 모두 명령에 명시적으로 설정되어 있으면 sed
제대로 작동합니다.
문자열 패턴은 예제 배열의 패턴을 따릅니다("new"에는 밑줄 "_"이 포함되고 "old"에는 해시태그 "#"이 포함됨).
Ubuntu 16.04 시스템에서 bash를 실행하고 있습니다.
매우 감사합니다!
답변1
sed
모든 교체를 수행하는 스크립트를 만든 다음 sed
해당 스크립트를 파일에 적용합니다.
for (( i=0; i<${#OLD[@]}; ++i )); do
printf 's/%s/%s/g\n' "${OLD[$i]}" "${NEW[$i]}"
done >script.sed
sed -f script.sed inputfile >outputfile && mv outptufile inputfile && rm script.sed
이렇게 하면 입력 파일을 구문 분석하는 데 필요한 횟수를 한 번으로 제한할 수 있습니다.
주어진 데이터에 대해 OLD
스크립트 NEW
는 sed
다음과 같이 생성됩니다.
s/_MAIN1_/#111/g
s/_MAIN2_/#222/g
답변2
작동하지 않는 전체 스크립트를 한 줄로 바꿀 수 있습니다.
sed 's/_MAIN\([12]\)_/#\1\1\1/g' oldfile.txt > newfile.txt
또는 더 읽기 쉽지만 동등합니다.
sed 's/_MAIN1_/#111/g;s/_MAIN2_/#222/g' oldfile.txt > newfile.txt
상황에 따라 이를 수행할 수 있는 다른 방법이 수십 가지 있습니다.실제사용 사례(예: 데이터의 출처, 실제 값이 무엇인지, 데이터로 무엇을 하려는지 등)
답변3
감사해요라케시 샤르마-i
sed 명령에 플래그를 사용하여 이 문제를 해결할 수 있었습니다 . 반복하기 전에 원본 파일을 백업하십시오.
cp oldfile.txt oldfile.backup
while (( i < length ))
do
sed -i -e 's/'"${OLD[$i]}"'/'"${NEW[$i]}"'/g' oldfile.txt
((i++))
done
다음번에는 문자열 조작을 위해 Perl을 사용할 것입니다.
편집하다:((i++))
무한 루프 방지를 위해 추가되었습니다 (감사합니다선행은 이루기가 어렵다)의 의견.