문자열의 일부를 제거하는 방법

문자열의 일부를 제거하는 방법

나는 문서와 많은 게시물을 계속 읽고 있지만 sed이것을 알아낼 수 없는 것 같습니다. 나는 많은 수의 Java 파일을 가지고 있습니다. 해당 파일에는 메서드를 사용하여 열거형을 정수로 변환하는 메서드에 대한 호출이 있습니다 toInt(). 모든 파일을 살펴보고 .toInt()특정 열거형을 제거하고 싶습니다 .

이것이 내가 원하는거야. 원래 코드 문자열:

foo(ENUM_NAME.ENUM_VALUE.toInt(), arg2, arg3)
foo(ENUM_NAME.ENUM_VALUE2.toInt(), arg2, arg3)

나는 다음과 같이 끝내고 싶습니다 :

foo(ENUM_NAME.ENUM_VALUE, arg2, arg3)
foo(ENUM_NAME.ENUM_VALUE2, arg2, arg3)

ENUM_VALUE수백 가지 가능성이 있을 수 있으므로 하드 코딩할 수는 없습니다. 무엇이 바뀌어야 하는지에 대해 약간의 혼란이 있는 것 같아서 좀 더 명확하게 설명하려고 노력하겠습니다.

TRANF_FIELD내 Java 파일에 열거형이 있습니다 . 해당 열거에 사용할 수 있는 값은 2,000개 값 중 하나일 수 있으며 그 뒤에 .toInt(). . .toInt()​함수 이름은 모두 관련이 없습니다.

다음은 Java 코드 전체에 분산되어 있는 코드 구성의 예와 이를 처리하는 방법입니다.

TRANF_FIELD.TRANF_VALUE_1.toInt()
.toInt()삭제하고 남겨두고                 싶습니다 TRANF_FIELD.TRANF_VALUE_1.
TRANF_FIELD.TRANF_KILL_ME.toInt()
                을( .toInt()를) 삭제하고 TRANF_FIELD.TRANF_KILL_ME
TRANG_FIELD.TRANG_VALUE_1.toInt()
                변경하지 않습니다. 가 아니기 때문입니다 TRANF_FIELD.
TRANF_FIELD.TRANF_VALUE_1.length()
                아니기 때문에 변화가 없습니다 .toInt().

답변1

다음 항목을 모두 변경하려는 것 같습니다.

TRANF_FIELD.some_enum_value.toInt()

에게

TRANF_FIELD.that_enum_value

다른 열거형(예: TRANG_FIELD.TRANG_VALUE.toInt())과 다른 메서드(예: TRANF_FIELD.TRANF_VALUE.length())는 그대로 둡니다. 이것은 간단해 보인다:

sed 's/\(TRANF_FIELD\.[A-Za-z0-9_]*\)\.toInt()/\1/'

어디

  • [A-Za-z0-9_]*임의 개수의 영숫자 문자(밑줄 포함)입니다. 이는 유효한 열거형 값과 일치시키기 위한 것입니다. 실제로 는 빈 문자열이나 숫자로 시작하는 문자열과 일치할 수 있기 [A-Za-z_][A-Za-z0-9_]*때문에 더 좋을 것입니다 .[A-Za-z0-9_]*
  • \(\)열거 이름( TRANF_FIELD), 리터럴 마침표( \.) 및 열거 값(첫 번째 글머리 기호부터)을 그룹화합니다.
  • \1이는 "첫 번째 그룹에서 찾은 전체 문자열을 교체", 즉 해당 .toInt()부분을 폐기한다는 의미입니다.
  • 한 줄에 여러 항목을 처리하려면 g마지막 슬래시 뒤에 (global)을 추가하세요.
  • 이는 포함된 공백(예: )을 처리하지 않습니다 TRANF_FIELD . TRANF_VALUE. 이 문제를 해결하는 것은 연습으로 남습니다.
  • 여러 줄로 나누어진 표현식은 처리되지 않습니다. 예:

        i = TRANF_FIELD
                 .TRANF_VALUE.toInt();
    

    고치기가 더 어렵습니다.

답변2

도와주신 모든 분들께 감사드립니다. 모든 Java 파일의 경로를 포함하여 하나의 답변에서 G-man이 제안한 -i를 추가하면 작동합니다. 너희들이 롱아일랜드에 오면 내가 맥주 한 잔 사줄게. 덕분에 시간이 많이 절약되었습니다.

sed -i 's/\(TRANF_FIELD\.[A-Za-z0-9_]*\)\.toInt()/\1/g' 

답변3

OS에 따라 인라인( -i) 을 사용하여 sed다음을 수행할 수 있습니다.

sed -i 's:\.toInt()::' filename

".toInt()" 인스턴스를 ""로 대체하는 경우 - .와일드카드 역할을 하지 않도록 이스케이프 처리됩니다.

여러 파일을 언급했으므로 현재 디렉터리와 하위 디렉터리에 있는 모든 파일을 검색하여 이 명령을 반복해야 합니다.

find . -type f -exec sed -i 's:\.toInt()::' {} \;

그러나 파일 이름에 공백이 포함되어 있으면 오류가 발생하므로 xargs모든 파일 이름 주위에 따옴표를 배치하는 명령을 사용하여 이를 처리할 수 있습니다.

find . -type f | xargs -I{} sed -i 's:\.toInt()::' "{}"

그러나 이는 컴파일된 파일도 선택하므로 이를 피하기 위해 유용한 기능을 사용하여 무시할 수 있습니다 perl.

find . -type f | perl -nle 'print if -T' | xargs -I{} sed -i 's:\.toInt()::' "{}"

답변4

sed 's/ENUM_NAME\.\(.*\)\.toInt()/ENUM_NAME.\1/g' 

관련 정보