패턴 일치 및 패턴 삭제를 위해 sed 사용

패턴 일치 및 패턴 삭제를 위해 sed 사용

다음 이름을 가진 두 개의 파일이 있습니다.

파일 1: RvA_X-IRB-bil-CA101-0+010000-20150327212332-055582-P

파일 2: RvA_X-IRB-bil-CA101-1+020000-20150327212332-055582-P

저는 이 명령을 사용하여 파일 이름의 특정 부분을 일치시킨 다음 교체합니다.

printf "%s\n" RvA_X-IRB-bil*P | sed -e 's/\(RvA_X-IRB\)-\bil-\(CA.*\)-\0+010000-\([0-9]\{8\}\).*-\([0-9]\{6\}\).*$/mv & \1-\2-\3-\4/'

위에서 언급한 명령은 파일 1에서는 제대로 작동하지만 파일 2에서는 작동하도록 명령을 수정하면 작동하지 않습니다. 두 번째 파일 이름에 대한 명령은 다음과 같습니다.

printf "%s\n" RvA_X-IRB-bil*P | sed -e 's/\(RvA_X-IRB\)-\bil-\(CA.*\)-\1+020000-\([0-9]\{8\}\).*-\([0-9]\{6\}\).*$/mv & \1-\2-\3-\4/'

유일하게 바뀐 부분은 바로 이 부분이에요\0+010000-\

답변1

정규식을 사용하면 다음을 식별할 수 있습니다.

"RvA_X-IRB-il-CA101-RvA_X-IRB+020000-20150327212332-055582-P"

그 이유 중 하나는 다른 사람들이 지적했듯이 \1 을 사용하고 있기 때문입니다. 중복된 "RvA_X-IRB"를 참고하세요.

그러나 "\b"도 사용한다는 점을 기억하는 것이 중요합니다. 이는 한쪽에 "비단어" 문자가 있고 다른쪽에 "단어" 문자가 있는 경우에만 작동합니다.https://www.gnu.org/software/sed/manual/sed.html#Invoking-sed

이것이 의도적인 것인지 확실하지 않기 때문에 "-bil"에서 "b"를 생략했습니다. 사실, 귀하의 RE가 첫 번째 경우에 작동한다는 사실에 놀랐습니다. 예를 들어:

echo "-bil" | sed 's#-\bil#GETIT#'
-bil

echo "-il" | sed 's#-\bil#GETIT#'
GETIT

또는:

printf "%s\n" RvA_X-IRB-bil | sed 's/\(RvA_X-IRB\)-\bil/GETIT/'
RvA_X-IRB-bil

printf "%s\n" RvA_X-IRB-il | sed 's/\(RvA_X-IRB\)-\bil/GETIT/'
GETIT

관련 정보