
このモデルに従うファイル名があります。
1.raw_bank_details_211.trg
2.raw_bank_details_222.trg
Unixでコマンドを使用しcut
、上記の文字列を切り取り、文字列から211
値を取得して値をエコーする必要があります。222
grepを使用しましたが、grep -o -E '[0-9]+'
代替が必要です。
答え1
cut
.
以下はいくつかの方法です。
2番目のフィールドを使用、インポート、または分離awk
し_
ます。.
awk -F '[_.]' '{print $(NF-1)}' file.txt
grep
PCRE( -P
) 使用:
grep -Po '\d+(?=[^_]*$)' file.txt
-o
一致する部分のみを取得する\d+
1 つ以上の数値の一致幅0のポジティブプレビューは、行末までのフォローアップを
(?=[^_]*$)
保証しません。_
そしてsed
:
sed -E 's/.*_([[:digit:]]+).*/\1/' file.txt
.*_
結局はすべて一致する_
([[:digit:]]+)
必要な数字を一致させてキャプチャグループに入れます。.*
残りも一致させてください交換時には
\1
キャプチャされたグループのみが使用され、
の場合、以下perl
と同じ論理ですsed
。
perl -pe 's/.*_(\d+).*/$1/' file.txt
必ず使用する必要がある場合は、cut
2つのステップで実行してください。最初に_
分離された4番目のフィールドをインポートし、次に分離された1.
番目のフィールドをインポートします。
cut -d_ -f4 file.txt | cut -d. -f1
フィールド番号をハードコードする必要があるため、お勧めできません。
文字列の場合は、シェルパラメータ拡張を使用して実行します。
% str='1.raw_bank_details_211.trg'
% str=${str##*_}
% echo "${str%%.*}"
211
それでもwhile
構文を使用し、各行を変数に入れてそれを行うことができますが、大容量ファイルでは速度が遅くなります。または、必要に_.
応じてasを使用してハードコードされたフィールド(たとえば)をインポートすることもできます。IFS
cut
例:
% cat file.txt
1.raw_bank_details_211.trg
2.raw_bank_details_222.trg
% awk -F '[_.]' '{print $(NF-1)}' file.txt
211
222
% grep -Po '\d+(?=[^_]*$)' file.txt
211
222
% sed -E 's/.*_([[:digit:]]+).*/\1/' file.txt
211
222
% perl -pe 's/.*_(\d+).*/$1/' file.txt
211
222
% cut -d_ -f4 file.txt | cut -d. -f1
211
222
答え2
cut
間違ったツールです。短い文字列(ファイル名など)を操作するには、可能であればシェルの文字列操作機能を使用してください。すべてのsh型シェル1(sh、dash、bash、ksh、zshなど)には、変数置換の一部として基本的な文字列操作があります。たとえば、参照してください。ダッシュボードマニュアル「パラメータ拡張」から。パターンに一致する最も短い/最も長いプレフィックス/サフィックスを削除できます。
ファイル名の最後の数値シーケンスが必要なので、次のようになります。
- 最後の数字の前のすべての項目を削除して、数字ではなくサフィックスを確認します。
- このサフィックスを削除してください。
- 数字ではなく最後の項目まですべて削除します。
filename=1.raw_bank_details_211.trg
suffix="${filename##*[0-9]}"
number="${filename%"$suffix"}"
number="${number##*[!-0-9]}"
¹POSIX 以前の Bourne シェルを除いて気にする必要はありません。