ファイルのタイトルは次のようにフォーマットされています。
- ファイル名01
- file07
- ファイルタイトル8
ファイル名20
文字列と数値の間に区切り文字はなく、文字列文字は各行で等しくありません。
ファイル名の末尾から数字だけを出力したい:
- 01
- 07
- 8
- 20
特に数字のみが必要で、英数字以外の文字の可能性がある場合は、sed
andを使用でき[^0-9]
ます。
cat filename | sed 's|[^0-9]||g'
sort
さらに、重複の可能性があり、順序が問題にならない場合は、これをand と組み合わせることができますuniq
。
cat filename | sed 's|[^0-9]||g' | sort | uniq
この最後の例では、ファイル内で見つかった番号の個別のリストが表示されます。ただし、先頭0
(つまり - 8
!= 08
) は考慮されます。
更新(bash のみ):
while read line; do \
echo ${line//[^0-9]/}; \
done < filename
(私の観点からは)読みにくいですが、同じ目標を達成する実行可能な代替手段です。また、追加|sort | uniq
はこの例でも機能します。
編集(ファイル拡張子)
ファイル拡張子 (または数字の最初のインスタンスの後の任意のテキスト) を保持するには、OP によるコメントに従って、コマンドg
からを削除しsed
、 a を追加すると、*
これが処理されます。
cat filename | sed 's|[^0-9]*||'
これにより、数字の最初のインスタンス以降のすべてが保持されるため、 と にfilename123.mp3
なります。123.mp3
file123part456.txt
123part456.txt
最後の数字と既存のファイル拡張子のみを具体的に取得するために非常に機密性の高い一致が必要な場合(元の質問が例を示しているように、ファイル拡張子がない可能性があります)、フラグとフラグgrep
を使用できます。-P
-o
grep -Po "[0-9]*(\..*)?" filename
これによりfilename123.mp3
、 return 123.mp3
、およびfile123part456.txt
returnが発生し456.txt
ます。この-P
フラグは、パターンを Perl 正規表現として解釈することを示します。これ-o
は、一致する行全体ではなく、行の一致する部分のみを返すことを示します。
trを使用する:
cat filename | tr -d [:alpha:]
grep -o
OPが投稿した質問に使用します:
grep -o '[0-9]*' filenames
コメントで、OP は先頭のテキストを削除する方法を尋ねました。その場合は、次を使用します。
sed 's/[^0-9]*//' filename
ASCII文字列を想定
エコー「HelloTrailz23」| tr -d'[AZ] [az]'
Unicodeファイル名を扱っている場合、すべての賭けは無効です。
これはうまくいくかもしれません(GNU sed):
echo filename123onetwothree.999 | sed 's/.*[^0-9]\([0-9]*\)$/\1/'
999
これにより、ファイル名の末尾から数字のみが抽出されます。
汎用的に使用するには:
sed 's/.*[^[:digit:]]\([[:digit:]]*\)$/\1/' file