파일을 읽는 동안 문자열을 바꿀 수 없습니다.

파일을 읽는 동안 문자열을 바꿀 수 없습니다.

Final.txt는 다음과 같습니다.

build/create_changes.sh
build/create_changes.sh-meta.xml
src/aura/camping/camping.design
src/aura/camping/camping.design-meta.xml

코드는 다음과 같습니다.

if [ -e final.txt ]
then
    ARRAY=()
    while read CFILE
    do
        echo Analyzing file `basename $CFILE`
        case "$CFILE"
            in
            *.design) TYPENAME="AuraDefinitionBundle";;
            *) TYPENAME="UNKNOWN";;
        esac

        if [ "$TYPENAME" == "AuraDefinitionBundle" ]
        then
            if [ $(contains "${ARRAY[@]}" $(basename -- "$(dirname -- "$CFILE")")) != "y" ]
            then
                echo baseFile from new method cFile $CFILE
                CFILENAME="$CFILE"

                replace="src/aura/"$(basename -- "$(dirname -- "$CFILE")")
                echo checkChanges "${CFILENAME/$CFILENAME/"$replace"}"
                CFILE="${CFILENAME/$CFILENAME/"$replace"}"
                echo baseFile from after change method cFile $CFILE
            else
                continue
            fi
        fi
    done < final.txt
else
    echo Change file not found!

에코 창에서 다음을 볼 수 있습니다.

 [exec] baseFile from new method cFile src/aura/camping/camping.design
 [exec] checkChanges src/aura/camping
 [exec] baseFile from after change method cFile src/aura/camping

그러나 파일은 변경되지 않았습니다. sed명령을 추가했지만 출력은 변경되지 않았습니다.

if [ $(contains "${ARRAY[@]}" $(basename -- "$(dirname -- "$CFILE")")) != "y" ]
then
    CFILENAME="$CFILE"
    ARRAY+=($(basename -- "$(dirname -- "$CFILE")"))
    replace="src/aura/"$(basename -- "$(dirname -- "$CFILE")")
    #CFILE="${CFILENAME/$CFILENAME/"$replace"}"
    sed -i 's/$CFILENAME/$replace/' final.txt
else
    continue
fi

예상 입력

build/create_changes.sh
build/create_changes.sh-meta.xml
src/aura/camping/camping.design
src/aura/camping/camping.design-meta.xml

예상 출력

build/create_changes.sh
build/create_changes.sh-meta.xml
src/aura/camping
src/aura/camping/camping.design-meta.xml

답변1

나는 당신의 논리를 따를 수 있을지 확신하지 못하지만, 이것은

awk '/\.design$/ {sub("/[^/]*$", "")} 1 ' file
build/create_changes.sh
build/create_changes.sh-meta.xml
src/aura/camping
src/aura/camping/camping.design-meta.xml

원하는 출력을 생성합니다 ...

답변2

basename으로 끝나는 모든 경로 이름을 제거하려면 다음을 수행하십시오 .design.

sed 's#/[^/]*\.design$##' final.txt

내부 편집을 수행하려면 sed -i위의 표현식을 사용하십시오(플래그는 약간 다르게 작동 -i하지만 이는 GNU sed등에 적용됩니다).

정규 표현식은 줄 끝의 문자 가 아닌 문자와 리터럴 문자열이 뒤따르는 문자열 /[^/]*\.design$과 일치합니다 .//.design

관련 정보