Bash-連続的な文字列操作

#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}" 

これらの2つの線を1つのライナーに接着する方法はありますか?

回答

FILE=$(basename "${1/%.jpeg/.jpg}")は私のために働きました。

テスト:

bash-$ ./test.sh /tmp/foo.jpeg foo.jpg 

スクリプトの内容:

bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE" 

コメント

  • 2つの行は少し交換可能であるため、このソリューションはこれまでのところ最も適切です…行が交換可能でない場合' sedは間違いなく必要になると思います。

回答

ネストできませんbashでの展開(zsh以外のksh、ash、その他のシェルでも)これは見た目の制限にすぎません。これは、説明したように、中間式を一時変数に割り当てることができるためです。ワンライナーにとっては少し面倒ですが、スクリプトでは、読みやすさの点で間違いなく優れています。

uを回避できます。外部ユーティリティbasenameを歌い、代わりに文字列操作構造を使用します:

FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}" 

ここで、次のことができるようになります。スクリプトをコマンド置換を外側に配置するように書き直します。これは一般的な現象ではなく、特定のワンライナー感以外のものも得られません。

Zshは、良くも悪くも、拡張をネストできます:

FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting 

または、basenameの代わりにzshの組み込み構造を使用することもできます:

FILE=${${1:t}/%.jpeg/.jpg} 

回答

行きます:

FILE=$(basename $1 .jpeg).jpg 

basenameの2番目のパラメーターは、ファイル名から削除されるサフィックスです(man basenameを参照)

回答

次のように、単一のsedコマンドを使用できます。

FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1") 

回答

sedを組み込むと、次のトリックが実行されます。

FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)" 

(これは、私ができないため、あなたの質問に正確に答えることはできません。それが可能かどうかはわかりません。)

回答

バッシュコンストラクトは変数名で機能するため、コマンドを直接埋め込む方法はありません。 @sr_のアプローチは、余分なフォークを気にしない場合の代替手段です。

回答

FILE=$(basename "${1/%.jpeg/.jpg}") 

を使用すると、短縮して移植性を高めることができます

FILE=$(basename "${1%.jpeg}.jpg") 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です