2012-02-01 23 views
3

変数内のファイルのパスと拡張子を一度に変更したいとします。一時変数Bash:2行の文字列演算を1行に適用する方法は?

せずに、次の

for F in $(find /foo/bar -name "*.ext"); do 
    Ftmp=${F%.ext} 
    cp $F ${Ftmp//bar/b0r}.tmp 
done 

は、2つの文字列操作はbashの唯一の手段で一度に適用することはできますか?

答えて

2

さてあなたは、一時変数なしのようにそれを行うことができます。

for F in $(find /foo/bar -name "*.ext"); do 
    cp $F "$(sed 's/\.[^.]\+$/.tmp/;s/bar/b0r/' <<< $F)" 
done 

しかし、それは、2つの新しいプロセスです。単純な変数展開では、その変数が必要だと思います。

を編集します。@glenn jackmanのおかげで、それはもう1つのプロセスです。

EDIT2:これはあなたのために働くかもしれない

for F in $(find /foo/bar -name "*.ext"); do 
    F=${F/.ext/} 
    cp ${F}.ext ${F/bar/b0r}.tmp 
done 
+0

: 'CP "$ F"「$(SEDさん/ \を[ ^。] \ + $ /。tmp /; s/bar/b0r/'<<< "$ F") "' –

+0

@glennjackmanありがとうございました。 –

+0

これはbashだけではありません。 sedは組み​​込みではありません。 – user123444555621

-1

:単一の変数の並べ替えを持つ唯一のbash

for F in $(find /foo/bar -name "*.ext" | sed 's/\.ext$//'); do 
    cp ${F}.ext ${F//bar/b0r}.tmp 
done 
3

使用バッシュtemporary variable

$_ Temporary variable; initialized to pathname of script or program 
     being executed. Later, stores the last argument of previous command. 
     Also stores name of matching MAIL file during mail checks. 
for F in $(find /foo/bar -name "*.ext") 
do 
    : ${F%.ext} 
    cp $F ${_//bar/b0r}.tmp 
done 
あなたは "エコー" を削除するには、 "ここに文字列を" bashのを使用することができ
+0

面白い!私はこれが存在することを知らなかった。少なくともbash 4.2ではbashのmanページには書かれていません。 – chepner

+0

@chepner: 'man bash'の「特殊パラメータ」を参照してください。 – choroba

関連する問題