正規表現を使用したローカル変数の処理

正規表現を使用したローカル変数の処理

エンコードするビデオファイルがあり、出力をローカルディレクトリに保存してファイル名をsource/削除したいと思います。source/

Fishシェルでは、次のコマンドを使用してこれを実行しました。

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

echoパイピング出力は少し粗雑だと思いますが、sedローカル変数の文字列だけを処理する関数はありますか?と似ていますsedが、ローカル変数またはファイル名にのみ適用されます。

答え1

ここでは、文字列からディレクトリ名を削除(変更)しようとしています。

標準シェルでは、次のものを使用できます。${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)

関連情報