2011-12-22 2 views
0

현재 파일 이름을 바꿀 수있는 bash 스크립트를 작성하고 있습니다. 모든 파일은 다음과 같습니다. * _ #. ext 여기서 *는 #과 9 자리 숫자 일 수 있습니다. 이 예에서는 대신 3 자리 숫자로 표시됩니다. 여기 정규식, 라인 끝과 Bash 스크립트가 함께 작동하지 않습니다.

는 무엇을해야하는지에 대한 기본적인 예입니다

입력 : example1_123.jpg
출력 : example1.jpg 충분히

간단한? 오른쪽 :

#!/bin/bash 
filename="example1_123.jpg" 
echo ${filename/_[0-9][0-9][0-9]/} 

출력 : example1.jpg이 ... 작동

한 입력이이 파일 이름 같은 것이 아닙니다 같이 example2_123.jpg_987.jpg

파일의 이름이 example2_123.jpg.jpg 대신 example2.jpg_987.jpg로 바뀝니다.

줄 끝 부분에 $를 사용했지만 $가 사용되었으므로이 부분이 중단되었습니다. 변수 :

#!/bin/bash 
filename="example2_123.jpg_987.jpg" 
echo ${filename/_[0-9][0-9][0-9].jpg$/}.${filename/*./} 

출력 : example2_123.jpg_987.jpg.jpg $ \ 또한 작동하지 않습니다. 나는 단서 있습니다 ...

누구든지 내가 그것을 필요로하는 방식으로 작동 시키도록 도울 수 있습니까?

P. [0-9] [0-9] [0-9] 대신 [0-9] {3}도 깨집니다. 누군가가 그것을 단축하는 방법을 알고 있다면, 그렇게 말하십시오 :

답변

2

사용 :

target=$(echo $f | sed 's,_[0-9]\+\(\.[a-z]\+\)$,\1') 

이 당신이 원하는 것을 할 것입니다. 큰 따옴표

[email protected] ~ $ f=example2_123.jpg_987.png 
[email protected] ~ $ target=$(echo $f | sed 's,_[0-9]\+\(\.[a-z]\+\)$,\1,') 
[email protected] ~ $ echo $target 
example2_123.jpg.png 
[email protected] ~ $ f=example1_123.png 
[email protected] ~ $ target=$(echo $f | sed 's,_[0-9]\+\(\.[a-z]\+\)$,\1,') 
[email protected] ~ $ echo $target 
example1.png 

서라운드 $(...) 당신은 $f 공간 이름이 있어야합니다.

이것은 sed이므로 고전적인 정규 표현식이므로 그룹화, 대체 및 한정 기호 (물론 * 제외)는 모두 백 슬래시 앞에 와야합니다.「정규의 "정규식은 정말 :

_[0-9]+(\.[a-z]+)$ 
+0

고마워.이게 잘 작동 했어. (jpg | png | gif)도 지원되지 않는다. |) ... 대안? – David

+0

아마도 bash는 구식 정규 표현식을 사용하기 때문에 아마도 bash가 실제로 제한되어 있기 때문에 'echo sed'의 조합을 사용하고 싶습니다. 역 참조 지원이 필요한 경우 – fge

+0

을 참조하십시오. 찾고있는 솔루션에 대한 게시물 수정 – fge

1

은 $ bash는 사용하지 않습니다, 배쉬는 % 접두사 사용

echo ${filename/%_[0-9][0-9][0-9].jpg/}.${filename/*./} 
+0

항상 _ 뒤에 3 자리 숫자가 나오는 한 작동합니다. 덕분에 – Sorpigal

+0

! 이게 내가 필요한거야! 그래도 연장은 jpg에만 국한되지 않기 때문에, 이것에 대해서도 사용할 수있는 regex 대체물이 필요합니다. 불행하게도, (jpg | png | gif)는 작동하지 않고 다시 깨지기도합니다. ( – David

0

나는 이것이 당신이 원하는 생각을 :

filename="example2_123.jpg_987.jpg" 
echo ${filename//_[0-9][0-9][0-9]/} 

그래서 모든 _NNN이 대체됩니다. 출력은 이상입니다 : example2.jpg.jpg

0

이 예에서와 같이 ${filename%_[0-9]*.*}.${filename##*.}"을 시도해보십시오

for filename in example1_123.jpg example2_123.jpg_987.jpg example2_4.jpg_1.jpg ; do 
    echo "$filename -> ${filename%_[0-9]*.*}.${filename##*.}" 
done 

이 뜻을 출력 따라서 항상 _ 어떤 숫자 다음에 마지막을 제거

example1_123.jpg -> example1.jpg 
example2_123.jpg_987.jpg -> example2_123.jpg.jpg 
example2_4.jpg_1.jpg -> example2_4.jpg.jpg 

.

관련 문제