Bashから抽出された値を変数として保持する方法

Bashから抽出された値を変数として保持する方法

ディレクトリ内の特定のファイル名から特定の値を抽出する必要がありますが、抽出された値を変数に保持するコマンドを使用したいと思います。私のファイルの形式が次のようになり、place.type-date.logそれを抽出してという変数に保存したいとしますfirst。どうすればいいですか?

使ってみよう

first=$($file | awk -F'[.-]' '{print $1}')

しかし、成功しませんでした。

普通私がしたら

echo " place.type-date.log" | awk -F'[.-]' '{print $1}'

結果はになります。 forループを使用して特定のディレクトリ内の複数のファイルに対してこれを行う必要があるため、コマンドをにplace置き換えました。place.type-date.log$file

place抽出された値を変数に保存したいので、firstextractコマンドを変数と同じにしましたfirst。したがって、スクリプトを実行しようとするとecho first何も表示されません。これは、抽出された値がまだ変数に保存されていないことを意味します。

答え1

place.type-date.logこのような変数にファイル名があり、他の変数fileの最初のドットの前にファイル名部分を保存したいとしますfirst。この場合、標準パラメータ置換を使用してこれを実行できます。

first=${file%%.*}

上記は、.*値からシェルパターンに一致する最も長いサフィックスを削除し、$file結果をfirst

%代わりにを使用すると、%%最も短い一致サフィックスが削除され、代わりにorをplace.type-date使用するとサフィックス文字列は削除されますが、サフィックス文字列は削除されません。###%%%

これらの代替を使用する別の例については、次を参照してください。私の答え到着前の質問


$fileあなたのコードはコマンドではなく文字列なので動作しませんplace.type-date.log。あなたは次のようなことを試したかもしれません

first=$( echo "$file" | awk -F '[.-]' '{ print $1 }' )

しかし、これは必要以上に複雑です。また、ファイル名(echo拡張可能)のエスケープシーケンスと改行文字を含むファイル名(行awkベースのテキスト処理ツール)にもいくつかの問題があります。

関連情報