2011-03-19 5 views
17

내가 파일의 확장자를 제거하는 방법을 알고 그것을 모른 채 파일의 확장자를 제거 :내가 그것을 알 때,

nameis=$(basename $dataset .csv) 

하지만 미리 아는없이 확장을 제거하려면, 아는 사람 방법 이 작업을 수행?

어떤 도움 감사, 테드

다음을 수행 할 수 떠들썩한 파티에서

답변

27

:

nameis=${dataset%.*} 

... 예 :이 구문은 bash는 man 페이지에 설명되어

$ dataset=foo.txt 
$ nameis=${dataset%.*} 
$ echo $nameis 
foo 

예 :

$ {param eter % 단어}

$ {매개 변수 %% 단어}

제거 일치하는 접미사 패턴. pathname 확장과 마찬가지로 패턴이 생성되도록 단어가 확장됩니다. 패턴이 매개 변수의 확장 된 값의 후행 부분과 일치하는 경우 확장 결과는 가장 짧은 패턴 ("%"대/소문자) 또는 가장 긴 일치 패턴 ("%%"대/소문자)이있는 매개 변수의 확장 된 값입니다)가 삭제되었습니다. 매개 변수가 @ 또는 *이면 패턴 제거 작업이 각 위치 매개 변수에 차례로 적용되고 확장은 결과 목록입니다. 매개 변수가 @ 또는 *로 첨자 된 배열 변수 인 경우 패턴 제거 작업이 배열의 각 멤버에 차례로 적용되고 확장은 결과 목록입니다.

1

${dataset%.*}과 같은 것일 수 있습니다. 확장자가없는 확장자가 없기 때문에 확장 기능의 일부가 아닌 점을 찾을 수 있습니다.

nameis=$(echo $filename | sed 's/\.[^.]*$//') 

을하지만 그 같은 .tar.gz 같은 이중 확장명을 가진 파일에 작동하지 않을 것입니다 :

1

어떤 경우 sed로, 마지막 점 다음 모두를 제거 할 수 있습니다.

0

내가 대신 같은 것을위한 basename 사용 sed 명령의 제안 :

echo "$fileName" | sed 's/\..*$//g'

+0

예를 들어'foo.bar.baz'와 같은 이름의 파일을 생성합니다. –

+0

불행히도 디렉토리에 점이있을 때 파일명이 'foo'가되기를 원했기 때문에 이것은 나에게 상당히 도움이되었습니다. –

1

nameis = $ {. 데이터 세트 %% *} 은 basename이 아무도 그것에 점이없는 가정합니다. 왼쪽에서 가능한 가장 긴 점없는 문자열을 반환합니다.

5

지금, 당신은 몇 가지 세련된 구식 정규 표현식을 원하는 경우 :

echo "foo.bar.tar.gz" | sed "s/^\(.*\)\..*$/\1/" 

-> 반환한다 foo.bar.tar

 
I will break it down: 
s/ Substitute 
^  From the beginning 
\( Mark 
.*  Everything (greedy way) 
\)  Stop Marking (the string marked goes to buffer 1) 
\.  until a "." (which will be the last dot, because of the greedy selection) 
.*  select everything (this is the extension that will be discarded) 
$  until the end 
/ With (substitute) 
\1  The buffer 1 marked above (which is the filename before the last dot(.) 
/ End 

크리스티아누 비노을

A의 실패
+0

설명 주셔서 감사합니다! –

관련 문제