使用正则表达式处理局部变量

使用正则表达式处理局部变量

我有一些视频文件source/要编码,我希望将输出保存在本地目录中,因此删除source/文件名。

我通过在 Fish shell 中使用以下命令来完成此操作:

$ for file in source/*.mkv
      ffmpeg -i "$file" -c:v copy -c:a copy (echo "$file" | sed -e "s/source\///")
  end

虽然,我发现管道输出echo有点sed简陋,但是否有一个函数只处理局部变量的字符串?与 a 类似sed,但仅适用于局部变量或文件名。

答案1

您要从此处的字符串中删除(固定)目录名称。

在标准 shell 中,您可以使用${parameter#pattern} 扩张pattern,它从字符串的开头删除parameter,因此${file#source/}会删除前缀source/

另外,在 ksh/Bash/zsh 中,${parameter/pattern}删除字符串中任意位置的匹配,这与 sed 的匹配s/pattern//更紧密。 (${..//..}删除所有匹配项)。那些模式与文件名通配符使用的模式相同;它们不是正则表达式。


在 中fish,有内置string replace命令,这似乎可以用在这里:

> set f source/foobar
> string replace source/ "" -- $f
foobar

或者-r使用正则表达式,所以我们不需要知道路径:

> string replace -r "^.*/" "" -- $f
foobar

(请注意,我对鱼不太熟悉。上面的方法似乎有效,但我不确定它在某些极端情况下是否会崩溃。)

答案2

您正在寻找basename

ffmpeg -i $file -c:v copy -c:a copy (basename $file)

相关内容