如何使用sed只获取文件名

Shi*_*ons 21 sed filenames

如何使用 sed 仅获取文件名?我有这个

out_file=$(echo $in_file|sed "s/\(.*\.\).*/\1mp4/g")
Run Code Online (Sandbox Code Playgroud)

但我也得到了路径/root/video.mp4,而且我只想要video.mp4.

ulo*_*sEI 33

basename来自 GNU coreutils 的可以帮助您完成这项工作:

$ basename /root/video.mp4
video.mp4
Run Code Online (Sandbox Code Playgroud)

如果您已经知道文件的扩展名,则可以basename使用以下语法调用basename NAME [SUFFIX]以删除它:

$ basename /root/video.mp4 .mp4
video
Run Code Online (Sandbox Code Playgroud)

或者另一种选择是使用sed以下方法在最后一个点之后切割所有内容:

$ basename /root/video.old.mp4 | sed 's/\.[^.]*$//'
video.old
Run Code Online (Sandbox Code Playgroud)

  • 像你一样使用 `sed 's/\.[^.]*$//'`,对于(隐藏的)`.filename` 和 `.` 和 `..` 目录将失败 (3认同)

dai*_*isy 12

最简单的解决方案是删除所有内容,直到最后一次出现/

echo /root/video.mp4 | sed 's/.*\///'


rus*_*ush 5

使用以下任何一种方式:

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 }')"
Run Code Online (Sandbox Code Playgroud)

附:您会得到相同的字符串,因为在您的语句\(.*\.\)中,从开头到点 ( /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 }'
Run Code Online (Sandbox Code Playgroud)