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

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

나는 문서와 수많은 게시물을 읽었 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()관련 없는 .function 이름을 제거해야 합니다 .

다음은 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

운영 체제에 따라 inline( -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' 

관련 정보