sed를 사용하여 검색 및 바꾸기

sed를 사용하여 검색 및 바꾸기

지난 주에 나는 실수로 Eclipse 프로젝트의 모든 문자열을 외부화했습니다. 나는 이것을 복원해야 하며 나의 유일한 희망은 sed입니다. 스크립트 생성을 시도했지만 sed를 처음 사용하고 매우 복잡한 작업이기 때문에 슬프게도 실패했습니다. 내가 해야 할 일은 이것이다:

파일의 문자열은 class.java현재 다음과 같은 형식(방법)을 갖습니다 Messages.getString(<key>). 예:

    if (new File(DataSource.DEFAULT_VS_PATH).exists()) {
        for (int i = 1; i <= c; i++) {
            if (!new File(DataSource.DEFAULT_VS_PATH
                    + Messages.getString("VSDataSource.89") + i).exists()) { //$NON-NLS-1$
                getnewvfspath = DataSource.DEFAULT_VS_PATH
                        + Messages.getString("VSDataSource.90") + i; //$NON-NLS-1$
                break;
            }
        }
    }

키와 일치 문자열은 messages.properties다음 형식으로 파일에 저장됩니다.

VSDataSource.92=No of rows in db = 
VSDataSource.93=Verifying db entry : 
VSDataSource.94=DB is open
VSDataSource.95=DB is closed
VSDataSource.96=Invalid db entry for 
VSDataSource.97=\ removed.
key=string

따라서 다음 형식의 Java 파일이 필요합니다.

    if (new File(DataSource.DEFAULT_VS_PATH).exists()) {
        for (int i = 1; i <= c; i++) {
            if (!new File(DataSource.DEFAULT_VS_PATH
                    + "String 2" + i).exists()) { //$NON-NLS-1$
                getnewvfspath = DataSource.DEFAULT_VS_PATH
                        + "String 1" + i; //$NON-NLS-1$
                break;
            }
        }
    }

어떻게 해야 합니까 sed? 아니면 더 쉬운 방법이 있나요?

답변1

"트릭"은 message.properties를 기반으로 sed 스크립트를 생성하는 것입니다.

$ sed 's!/!\\!;s!\([^=]*\)=\(.*\)!s/"\1"/"\2"/g!' message.properties > message.sed
$ sed -f messages.sed class.java > class.java.reverted
$ rm messages.sed

다음과 같이 시작할 수 있습니다.

VSDataSource.92=No of rows in db = 
VSDataSource.93=Verifying db entry : 
VSDataSource.NN=Foo/bar

최종 결과는 다음과 같습니다.

s/"VSDataSource.92"/"No of rows in db= "/g
s/"VSDataSource.93"/"Verifying db entry : "/g
s/"VSDataSource.NN"/"Foo\/bar"/g

답변2

소스 컨트롤이 없나요?쯧쯧,쯧쯧. 고치는 걸 추천해요저것아주 작은 샘플에서 나에게 도움이 된 이 스크립트를 실행하기 전에 문제가 발생합니다.

#!/bin/bash
set -x
for i in `seq 92 97`
do
    X=$(sed -n s/^VSDataSource.$i=//p messages.properties)
    sed -i "s+Messages.getString(\"VSDataSource.`echo $i`\")+\"`echo $X`\"+g" class.java
done

물론, 매개변수를 seq 및 sed로 변경하십시오(아마도 class.java 대신 *java). 그러나 솔직히 이것이 귀하의 문제에 대한 최선의 해결책은 아닐 것입니다. "문자열 외부화" 버튼이 있으면 IDE에도 "문자열 내부화" 버튼이 있어야 하지 않나요?

관련 정보