Bash while 루프 검색 및 sed를 사용하여 바꾸기

Bash while 루프 검색 및 sed를 사용하여 바꾸기

다음 스크립트에 문제가 있습니다(이 부분이 관련 부분입니다).

#!/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스크립트 NEWsed다음과 같이 생성됩니다.

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

감사해요라케시 샤르마-ised 명령에 플래그를 사용하여 이 문제를 해결할 수 있었습니다 . 반복하기 전에 원본 파일을 백업하십시오.

cp oldfile.txt oldfile.backup
while (( i < length ))
do
  sed -i -e 's/'"${OLD[$i]}"'/'"${NEW[$i]}"'/g' oldfile.txt
  ((i++))
done

다음번에는 문자열 조작을 위해 Perl을 사용할 것입니다.

편집하다:((i++))무한 루프 방지를 위해 추가되었습니다 (감사합니다선행은 이루기가 어렵다)의 의견.

관련 정보