web-dev-qa-db-ja.com

「。」の前のファイル名の一部を抽出する方法または延長前

以下の形式のファイルがあります。

abc_asdfjhdsf_dfksfj_12345678.csv
hjjhk_hkjh_asd_asd_sd_98765498.csv
hgh_nn_25342134.exe

.の前と最後の_の後で値を取得したい。

結果は次のようになります。

abc_asdfjhdsf_dfksfj_12345678.csv   ----> 12345678
hjjhk_hkjh_asd_asd_sd_98765498.csv  ----> 98765498
hgh_nn_25342134.exe                 ----> 25342134
7
shah

Awkも使用できます。

_$ echo "abc_asdfjhdsf_dfksfj_12345678.csv" | awk -F'[_.]' '{print $4}'
12345678
_

フィールドセパレーターを___または_._として設定します。次に、列番号4を出力すると、望ましい結果が得られます(_$4_ではなく$(NF-1)(最後のフィールド)を使用することもできます)。

13
Tingrammer

POSIXシェル変数にファイル名がある場合:

file=abc_asdfjhdsf_dfksfj_12345678.csv
n=${file%.*}   # n becomes abc_asdfjhdsf_dfksfj_12345678
n=${file##*_}  # n becomes 12345678.csv

説明により:

  • ${variable%pattern} のようなものです $variable、マイナス最短バックエンドからの一致パターン;
  • ${variable##pattern} のようなものです $variablefront-endからのlongest一致パターンを差し引いたもの。

パラメータ展開の詳細については このような参照 を参照してください。

ファイル名のリストが1行に1つのファイル名を持つテキストストリームにある場合:

sed -n 's/.*_\(.*\)\..*/\1/p'
10

GNU grep

$ echo abc_asdfjhdsf_dfksfj_12345678.csv | grep -oP '(?<=_)\d+(?=\.)'
12345678

説明

  • (?<=)は後読みです、(?<=_)はアンダースコアに一致します_パターンの前。
  • \d+は1つ以上の数値と一致します。
  • (?=)は先読みです、(?=\.)はドットに一致します.パターンの後。

全体の正規表現は、_および.

3
cuonglm

選択する下線は最後のものなので:

変数を使用してファイル名を含める:

file=abc_asdfjhdsf_dfksfj_12345678.csv
n=${file%.*}          # remove the extension `.csv`
n=${n#"${n%_*}_"}     # remove up to the last underscore `_`
  1. 最初に拡張子を削除します(最後のドットの後)
  2. 最後から削除する値を構築する_"${n%_*}_"
  3. nの先頭から2から値を削除します:${n#value}
1
Isaac

単に:

a=hjjhk_hkjh_asd_asd_sd_98765498.csv
pos1=${a%_*}
pos2=${a%.*}
echo ${a:${#pos1}+1:${#pos2}-${#pos1}-1}

last _のオフセットをpos1に取得します。lastのオフセットを取得します。 pos2の部分文字列を_オフセットからに変更します。オフセット

0
periket2000

あなたはawkを使って同じことを得ることができます

awk -F"." '{print $1}' | awk -F"_" '{print $NF}'

あなたの例から

echo "abc_asdfjhdsf_dfksfj_12345678.csv" | awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
12345678

echo "hjjhk_hkjh_asd_asd_sd_98765498.csv" | awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
98765498

echo "hgh_nn_25342134.exe" | awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
25342134
0
upkar