내 셸에서 인쇄할 수 없는 일본어 문자가 원래 포함된 파일 이름을 일괄적으로 바꾸는 방법을 찾으려고 합니다. 정규 표현식의 작동 방식을 이해하는 데 있어 확실히 뭔가 빠졌습니다. 이 사용 사례에서는
내가 실행하면 ls
다음이 있습니다.
AIR?t?H?[????002.jpg
AIR?t?H?[????009.jpg
AIR?t?H?[????075.jpg
그리고 ls -ldb *
나에게 이것을 준다:
AIR\342t\342H\374[\342\353\342\307002.jpg
AIR\342t\342H\374[\342\353\342\307009.jpg
AIR\342t\342H\374[\342\353\342\307075.jpg
기본적으로 나는 사이의 모든 것을 일치시키고 교체하고 싶습니다.공기그리고[0-9]*
나는 현재 비슷한 것을 찾고 있습니다.
find AIR*.jpg -type f -exec sed -ri 's/(?<=AIR)(.*?)([0-9]*)/\2test/' {} +
하지만 다음 오류가 발생합니다.
sed: -e 표현식 #1, 문자 31: 앞의 정규식이 유효하지 않습니다.
나도 사용해봤는데
echo AIR�t�H�\[����002.jpg | sed -r 's/AIR([^[:print:]\t\r])*/\1toto/g'
하지만 이름이 바뀌었어공기"특수 문자" 그룹 대신
토토�t�H�[����002.jpg
그리고
echo AIR�t�H�\[����002.jpg | sed -r 's/AIR([^[:print:]\t\r])*/\2toto/g'
반품
sed: -e 표현식 #1, 문자 33: 's' 명령의 RHS에 대한 잘못된 참조\2
그것도 옵션이 될 수 있을 것 같지만 tr
두 그룹 모두에 특수 문자만 있는 것은 아닙니다.공기그리고[0-9]*그래서 이것이 내가 얻는 것입니다:
echo AIR�t�H�\[����002.jpg | tr -c '[:print:]\t\r\n'test '[ *]'
반품:
에어tH [ 002.jpg
답변1
sed
교체는 첫 번째 인수와 일치하는 인스턴스( 를 사용한 이후의 모든 인스턴스)를 찾고 g
정확히 일치하는 인스턴스를 두 번째 인수로 바꿉니다. 따라서 첫 번째 매개변수에 "AIR"를 포함하면 대체됩니다. 이를 유지하려면 두 번째 매개변수에 포함해야 합니다. 잘못된 참조에 대해 불평하는 경우 sed
첫 번째 매개변수에 해당 그룹을 정의하지 않았음을 의미합니다( 지정한 대로 \(
and \)
, 또는 (
and 사용 ).)
-r
"AIR" 뒤에 임의의 문자와 숫자가 오기 때문에 다음을 제안합니다.
sed -r 's/AIR([^[:digit:]]*)([[:digit:]]+).jpg/AIRtest\2.jpg/g'
이는 "AIR"를 "AIR"로 바꾸고, 숫자가 아닌 모든 숫자를 "test"로 바꾸고 그 이후의 모든 숫자를 유지합니다. "AIR"와 숫자 사이의 문자를 처리할 필요가 없으면 무시해도 됩니다.
sed -r 's/AIR[^[:digit:]]*([[:digit:]]+).jpg/AIRtest\1.jpg/g'
Perl이 있는 경우 rename
이를 바꾸어 파일 이름을 바꿀 수 있습니다.
rename 's/AIR[^[:digit:]]*([[:digit:]]+).jpg/AIRtest\1.jpg/g' AIR*.jpg
또는
rename 's/AIR[^[:digit:]]*([[:digit:]]+).jpg/AIRtest$1.jpg/g' AIR*.jpg
( 그룹 참조를 rename
선호합니다 $
).