sh 스크립트의 sed 및 awk는 텍스트를 대체하지 않습니다.

sh 스크립트의 sed 및 awk는 텍스트를 대체하지 않습니다.

필요한 작업은 문자열을 찾은 다음 이를 다른 문자열(모든 경우)로 바꾸고 파일을 다시 작성/업데이트하는 것입니다.

파일은 pbxproj파일입니다.파일의 예를 링크했습니다

문서 샘플(이 파일은 작동하지 않는 예제를 여기에서 공유하기에는 너무 큽니다. 전에 링크를 확인할 수 있습니다.):

// !$*UTF8*$!
{
    archiveVersion = 1;
    classes = {
    };
    objectVersion = 46;
    objects = {

/* Begin PBXBuildFile section */
        4D1498151706397100876A74 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 4D1498141706397100876A74 /* Icon.png */; };
        4D1498171706397300876A74 /* [email protected] in Resources */ = {isa = PBXBuildFile; fileRef = 4D1498161706397300876A74 /* [email protected] */; };
        F8F1FD8E1705DF6A0012AA85 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8F1FD8D1705DF6A0012AA85 /* UIKit.framework */; };
        F8F1FD901705DF6A0012AA85 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8F1FD8F1705DF6A0012AA85 /* Foundation.framework */; };
        F8F1FD921705DF6A0012AA85 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8F1FD911705DF6A0012AA85 /* CoreGraphics.framework */; };
        F8F1FDB61705DF6A0012AA85 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8F1FD8D1705DF6A0012AA85 /* UIKit.framework */; };
        F8F1FDB71705DF6A0012AA85 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8F1FD8F1705DF6A0012AA85 /* Foundation.framework */; };
        F8F1FDF5170609D20012AA85 /* UIImage+TBTint.m in Sources */ = {isa = PBXBuildFile; fileRef = F8F1FDDD170609D20012AA85 /* UIImage+TBTint.m */; };
        F8F1FDF6170609D20012AA85 /* TBBAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F8F1FDE0170609D20012AA85 /* TBBAppDelegate.m */; };
        F8F1FDF7170609D20012AA85 /* TBBFlatImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F8F1FDE2170609D20012AA85 /* TBBFlatImageViewController.m */; };
        F8F1FDF8170609D20012AA85 /* TBBGradientImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F8F1FDE4170609D20012AA85 /* TBBGradientImageViewController.m */; };
        F8F1FDF9170609D20012AA85 /* TBBMasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F8F1FDE6170609D20012AA85 /* TBBMasterViewController.m */; };
        F8F1FDFB170609D20012AA85 /* [email protected] in Resources */ = {isa = PBXBuildFile; fileRef = F8F1FDEA170609D20012AA85 /* [email protected] */; };
        F8F1FDFC170609D20012AA85 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = F8F1FDEB170609D20012AA85 /* Default.png */; };
        F8F1FDFD170609D20012AA85 /* [email protected] in Resources */ = {isa = PBXBuildFile; fileRef = F8F1FDEC170609D20012AA85 /* [email protected] */; };
        F8F1FDFE170609D20012AA85 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F8F1FDED170609D20012AA85 /* MainStoryboard.storyboard */; };
.
.
.
.
.
        44567HGFGHJK456GH44GHJK /* Debug */ = {
            .
            .
            .
            buildSettings = {
                ...
                FRAMEWORK_SEARCH_PATHS = (
                    "$(inherited)",
                    "$(PROJECT_DIR)/Flutter",
                );
                INFOPLIST_FILE = Runner/Info.plist;
                IPHONEOS_DEPLOYMENT_TARGET = 12.0;
                LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
                LIBRARY_SEARCH_PATHS = (
                    "$(inherited)",
                    "$(PROJECT_DIR)/Flutter",
                );
                MARKETING_VERSION = 1.1.1;
#!/bin/sh

cpath=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)/")
xcodePath="${cpath}ios/Runner.xcodeproj/project.pbxproj"

sed -i -e 's/MARKETING_VERSION = 1.1.1/MARKETING_VERSION = 1.1.2/g' xcodePath

# or tried with awk too

# awk '{gsub("MARKETING_VERSION = 1.1.1","MARKETING_VERSION = 1.1.2"); print}' xcodePath

작업이 완료된 후 파일을 확인했지만 아무것도 변경되지 않았습니다. 오류도 없고 경고도 없습니다! 문제를 해결할 수 있는 방법이 있나요?

답변1

스크립트는 "$"를 사용하여 xcodepath 변수를 확장할 수 없습니다. 좋다:

sed -i -e 's/MARKETING_VERSION = 1.1.1/MARKETING_VERSION = 1.1.2/g' "$xcodePath"

답변2

셸에서 변수 값을 얻으려면 접두사를 붙여야 합니다 $(인용할 필요가 없는 특별한 경우가 아니면 인용 xcodePath해야 합니다 ) "$xcodePath".

.또한 메타 문자를 이스케이프하고 정규식을 고정 해야 합니다 . 그렇지 않으면 실수로 MARKETING_VERSION = 1.1.10또는 MARKETING_VERSION = 12151를 변경할 수 있습니다 MARKETING_VERSION = 1.1.2. 또한 MARKETING_VERSION = 1.1.마지막 숫자를 1에서 2로 변경하기 위해 문자열을 반복할 필요가 없으며 캡처 그룹을 사용하기만 하면 됩니다.

sed -Ei 's/(\<MARKETING_VERSION = 1\.1\.)1;/\12;/' "$xcodePath"

이미 GNU sed를 사용하고 있으므로 캡처 그룹에서 대괄호를 이스케이프 처리할 필요가 없도록 이와 같은 것을 -i추가했습니다 .-E

관련 정보