我有一些视频文件source/
要编码,我希望将输出保存在本地目录中,因此source/
在文件名中删除。
我通过在鱼壳中使用以下命令来完成此操作:
$ for file in source/*.mkv
ffmpeg -i "$file" -c:v copy -c:a copy (echo "$file" | sed -e "s/source\///")
end
虽然,我发现管道的输出echo
有点sed
初级,但是否有一个函数只处理局部变量的字符串?像 ased
但仅用于局部变量或文件名。
您正在从此处的字符串中删除(固定)目录名称。
在标准外壳中,您可以使用
${parameter#pattern}
扩展来做到这一点,它pattern
从字符串的开头删除 inparameter
,因此${file#source/}
会删除前缀source/
。同样在 ksh/Bash/zsh
${parameter/pattern}
中删除字符串中任何地方的匹配,这与 sed 的匹配s/pattern//
更紧密。(${..//..}
删除所有匹配项)。这些模式与用于文件名通配符的模式相同;他们不是正则表达式。在
fish
中,有内置string replace
命令,似乎可以在这里使用:或使用
-r
正则表达式,所以我们不需要知道路径:(请注意,我对鱼不太熟悉。上述方法似乎可行,但我不确定它是否会在某些极端情况下中断。)
您正在寻找
basename
: