ファイル名から与えられた文字列の前に現れる数字を抽出するには?

ファイル名から与えられた文字列の前に現れる数字を抽出するには?

ファイルが多い

101s18-exam02--100-booklets.pdf
MATH232 Exam 01 99 booklets.pdf
35BOOKLETS.pdf

各ファイルから「小冊子」という単語の前に現れる数字を抽出するコマンドを作成したいと思います(大文字と小文字を無視)。したがって、このコマンドを実行すると、結果は次のようになります。

$ bash mycommand.sh 101s18-exam02--100-booklets.pdf
100

$ bash mycommand.sh MATH232 Exam 01 99 booklets.pdf
99

$ bash mycommand.sh 35BOOKLETS.pdf
35

どうすればいいですか?

答え1

grepこの-oフラグを知っている実装を使用して、次のようにしますtr

#!/bin/sh

printf '%s\n' "$@" | grep -oiE '[0-9]+[^0-9]*booklets' | tr -dc '0-9\n'

これはスクリプトです(動作しますがスクリプトshではありません)。コマンドラインから渡された文字列にリテラル改行文字が含まれていないとします。bashbash

拡張正規表現はandなどの文字列[0-9]+[^0-9]*bookletsと一致し、これは正確にそれから返されます。数字または改行文字を除く出力のすべての項目を削除します。<integer><zero or more non-digit characters><"booklets">-ogreptrgrep

文字列から数字ではなく、最初の文字内のすべての内容を削除するtrことで置き換えることができます。sed 's/[^0-9].*//'

テストしてみてください:

$ sh script.sh 101s18-exam02--100-booklets.pdf
100
$ sh script.sh "MATH232 Exam 01 99 booklets.pdf"
99
$ sh script.sh 35BOOKLETS.pdf
35

$ sh script.sh 101s18-exam02--100-booklets.pdf "MATH232 Exam 01 99 booklets.pdf" 35BOOKLETS.pdf
100
99
35

スペースを含む文字列は引用符で囲む必要があります。

答え2

Bashの条件付きテスト演算子は、[[ファイル名を正規表現と比較し、角括弧式を抽出します。

shopt -s nocaseglob
for f in *booklets*
do
  [[ $f =~ ([[:digit:]]+)[^[:digit:]]?booklets ]] && echo "${BASH_REMATCH[1]}"
done

これは、大文字と小文字を区別しない単語「ブックレット」を含む現在のディレクトリ内のすべての一致するファイルを繰り返します。一度に1つのファイルに対して作業を実行するには、上記の内容を単純化してスクリプトまたは関数に入れることができます。

extractnumber ()
(
    shopt -s nocaseglob
    if [ ! -f "$1" ]; then echo "File $1 not found!"; return 1; fi
    [[ $1 =~ ([[:digit:]]+)[^[:digit:]]?booklets ]] && echo "${BASH_REMATCH[1]}";
)

...そして、次のように呼び出します。

$ extractnumber 35BOOKLETS.pdf
35
$ extractnumber MATH232\ Exam\ 01\ 99\ booklets.pdf
99
$ extractnumber 101s18-exam02--100-booklets.pdf
100
$ extractnumber foobar
File foobar not found!

答え3

私は以下に説明するようにこれを行い、pythonscript.py 必要な一致を検索するために出力をパイプライン化しました。私はPythonを使用することもできましたが、出力がパイプラインとして処理されるようにgrepを使用したいと思いました。

入力ファイル名はinputfilefile:

101s18-exam02--100-booklets.pdf
MATH232 Exam 01 99 booklets.pdf
35BOOKLETS.pdf

使用法:

python pythonscript.py |grep -o "^[0-9]*"

これには以下がpythonscript.py含まれます。

#!/usr/bin/python
import re
o = open('inputfile','r')
k=re.compile(r'\d{2,3}\s?-?booklets',re.IGNORECASE)
for g in o:
    u=re.search(k,g)
    if u:
       print u.group()

出力:

100
99
35

答え4

このsedを試すことができます

sed -E '
  s/^/ /
  s/.*[^0-9]([0-9]+).?[bB][oO]{2}[kK][lL][eE][tT][sS].*/\1/
' infile

関連情報