나는 문서와 많은 게시물을 계속 읽고 있지만 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'