-1

ファイルのタイトルは次のようにフォーマットされています。

  • ファイル名01
  • file07
  • ファイルタイトル8
  • ファイル名20

  • 文字列と数値の間に区切り文字はなく、文字列文字は各行で等しくありません。

  • ファイル名の末尾から数字だけを出力したい:

  • 01
  • 07
  • 8
  • 20
4

6 に答える 6

7

特に数字のみが必要で、英数字以外の文字の可能性がある場合は、sedandを使用でき[^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.mp3file123part456.txt123part456.txt

最後の数字と既存のファイル拡張子のみを具体的に取得するために非常に機密性の高い一致が必要な場合(元の質問が例を示しているように、ファイル拡張子がない可能性があります)、フラグとフラグgrepを使用できます。-P-o

grep -Po "[0-9]*(\..*)?" filename

これによりfilename123.mp3、 return 123.mp3、およびfile123part456.txtreturnが発生し456.txtます。この-Pフラグは、パターンを Perl 正規表現として解釈することを示します。これ-oは、一致する行全体ではなく、行の一致する部分のみを返すことを示します。

于 2012-09-12T22:02:42.177 に答える
6

trを使用する:

cat filename | tr -d [:alpha:]
于 2012-09-12T21:58:58.400 に答える
2

grep -oOPが投稿した質問に使用します:

grep -o '[0-9]*' filenames

編集

コメントで、OP は先頭のテキストを削除する方法を尋ねました。その場合は、次を使用します。

sed 's/[^0-9]*//' filename
于 2012-09-13T08:44:27.303 に答える
1

ASCII文字列を想定

エコー「HelloTrailz23」| tr -d'[AZ] [az]'

Unicodeファイル名を扱っている場合、すべての賭けは無効です。

于 2012-09-12T21:58:36.013 に答える
1

これはうまくいくかもしれません(GNU sed):

echo filename123onetwothree.999 | sed 's/.*[^0-9]\([0-9]*\)$/\1/'
999

これにより、ファイル名の末尾から数字のみが抽出されます。

汎用的に使用するには:

sed 's/.*[^[:digit:]]\([[:digit:]]*\)$/\1/' file
于 2012-09-13T07:11:21.693 に答える