0

特定のパターンに従うファイル名から数字を抽出しようとしています:

file-8923489_something.txt
another_file-8923489_something.txt
some-other_file-8923489_something.txt

上記の3つのファイル名で機能するテキスト「file-」と「_something」の間の番号を抽出したいと思います。

これについて最善の方法は何ですか?

## や %% などの演算子のみを使用してこれを行うことは可能ですか? 次のようなものはどうですか:

filename=file-8923489_something.txt
file=${${filename##*file}%%_something}}

しかし、それは私が期待したようには機能しませんでした。

4

3 に答える 3

2

Pre BASH 正規表現を使用する:

x="some-other_file-8923489_something.txt"
[[ "$x" =~ file-([0-9]*)_something ]] && echo ${BASH_REMATCH[1]}
8923489

またはこれgrep -Pも機能します:

grep -oP "file-\K\d+(?=_something)" file
8923489
8923489
8923489

または awk を使用:

awk -F 'file-|_something' '{print $2}' file
8923489
8923489
8923489
于 2013-10-09T08:59:52.693 に答える
0

演算子のみを使用してこれを行うことは可能ですか...

$ filename="file-8923489_something.txt"
$ file=${foo//[^0-9]/}
$ echo $file
8923489

Shell Parameter Expansionを参照してください。

または、次のように言うこともできます。

$ file=$(tr -dc '[[:digit:]]' <<< "$filename")
$ echo $file
8923489
于 2013-10-09T09:00:40.227 に答える
0

grep:

$ echo "file-8923489_something.txt
another_file-8923489_something.txt
some-other_file-8923489_something.txt" | grep -Po '(?<=file-)\d+'
8923489
8923489
8923489

または純粋な場合bash

d="your_string"
d1=${d%_*}
your_final_string=${d1##*-}

テスト

$ d="file-8923489_something.txt"
$ d1=${d%_*}
$ echo $d1
file-8923489
$ echo ${d1##*-}
8923489

$ d="some-other_file-8923489_something.txt"
$ d1=${d%_*}
$ echo $d1
some-other_file-8923489
$ echo ${d1##*-}
8923489

$ d="another_file-8923489_something.txt"
$ d1=${d%_*}
$ echo $d1
another_file-8923489
$ echo ${d1##*-}
8923489
于 2013-10-09T08:57:06.567 に答える