다음 이름을 가진 두 개의 파일이 있습니다.
파일 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