sed를 사용하여 파일 이름만 얻는 방법은 무엇입니까? 나는 이것을 가지고있다
out_file=$(echo $in_file|sed "s/\(.*\.\).*/\1mp4/g")
그러나 나는 또한 길을 얻었고 /root/video.mp4
그것이 내가 원하는 전부입니다 video.mp4
.
답변1
basename
GNU에서핵심 도구이 작업을 수행하는 데 도움이 될 수 있습니다.
$ basename /root/video.mp4
video.mp4
파일 확장자를 이미 알고 있는 경우 basename
다음 구문을 사용하여 호출 basename NAME [SUFFIX]
하여 제거 할 수 있습니다.
$ basename /root/video.mp4 .mp4
video
또는 또 다른 옵션은 다음을 사용하여 마지막 지점 이후의 모든 것을 잘라내는 것입니다 sed
.
$ basename /root/video.old.mp4 | sed 's/\.[^.]*$//'
video.old
답변2
가장 간단한 해결책은 끝까지 모든 것을 삭제하는 것입니다 /
.
echo /root/video.mp4 | sed 's/.*\///'
답변3
다음 방법 중 하나를 사용하십시오.
out_file="${in_file##*/}"
out_file="$(basename $in_file)"
out_file="$(echo $in_file | sed 's=.*/==')"
out_file="$(echo $in_file | awk -F"/" '{ print $NF }')"
\(.*\.\)
참고로 명령문이 시작부터 지점( )까지 /root/video.
문자열과 일치하고 .mp4
원래 문자열과 동일한 문자열을 수동으로 추가하기 때문에 동일한 문자열을 얻습니다 . 을 사용해야 합니다 s=.*\([^/]*\)=\1=
.
업데이트: (첫 번째 항목은 이제 수정되었습니다.)
확장자 없이 고유한 파일 이름을 얻으려면 다음을 수행하십시오.
out_file="$(echo $in_file | sed 's=.*/==;s/\.[^.]*$/.new_ext/')"
out_file="$(echo $in_file | sed 's=\([^/]*\)\.[^./]*$=\1.new_ext=')"
out_file="$(echo $in_file | awk -F"/" '{ gsub (/\.[^/.]*$/,".new_ext",$NF);print $NF }'
답변4
POSIXly, 디렉토리 이름과 확장자를 제거하십시오.
rootname() {
LC_ALL=C awk -- 'BEGIN{
for (i = 1; i < ARGC; i++) {
file = ARGV[i]
if (file == "")
print ""
else {
sub("/*$", "", file) # remove trailing / characters if any
if (file == "")
print "/"
else {
sub(".*/", "", file) # remove dir part
if (file ~ /[^.]\./) # has a . other than as the first character
# also do not consider . and .. have an extension
sub(/\.[^.]*$/, "", file)
print file
}
}
}
}' "$@"
}
예:
$ rootname ~/.zshrc
.zshrc
$ rootname foo/bar/
bar
$ rootname /
/
$ rootname ""
$ rootname .foo.bar
.foo
$ rootname file.tar.gz
file.tar
$ rootname foo.d/bar
bar
$ rootname $'foo.d/\nbar.x'
bar
csh, tcsh, zsh, bash 또는 vim에는 :t
(꼬리) 그리고 :r
(뿌리) 수정자를 결합하여 :t:r
얻을 수 있습니다.뿌리~의꼬리, 하지만 참고하세요:
- 에서는
bash
히스토리 확장에서만 사용 가능하므로 변수의 내용에 적용해야 하는 경우에는 유용하지 않습니다. rootname
코너 케이스 값(예: ) 또는 확장자가 없는 숨겨진 파일(예: )에 대해 위 함수/
와 다른 결과를..
얻을 수 있습니다.~/.cshrc
- 를 제외하고
zsh
with는 빈 문자열로file=/foo/bar/
확장됩니다 .$file:t:r
를 사용하여 동일한 작업을 수행할 수 있지만 sed
를 사용하는 것만큼 명확하지는 않습니다 awk
.
rootname() {
printf '%s\n' "$1" | LC_ALL=C sed '
:1
$!{
N; # load full input into pattern space for filenames with newlines
b1
}
# handle the empty string
/./!b
# remove trailing slashes
s|/*$||
/./! {
# handle slash
s|^|/|
b
}
s|.*/||; # remove dir part
/[^.]\./ s/\.[^.]*$//'
}