以下の形式のファイルがあります。
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
Awkも使用できます。
_$ echo "abc_asdfjhdsf_dfksfj_12345678.csv" | awk -F'[_.]' '{print $4}'
12345678
_
フィールドセパレーターを__
_または_.
_として設定します。次に、列番号4を出力すると、望ましい結果が得られます(_$4
_ではなく$(NF-1)
(最後のフィールド)を使用することもできます)。
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}
のようなものです $variable
、front-endからのlongest一致パターンを差し引いたもの。パラメータ展開の詳細については このような参照 を参照してください。
ファイル名のリストが1行に1つのファイル名を持つテキストストリームにある場合:
sed -n 's/.*_\(.*\)\..*/\1/p'
GNU grep
:
$ echo abc_asdfjhdsf_dfksfj_12345678.csv | grep -oP '(?<=_)\d+(?=\.)'
12345678
説明
(?<=)
は後読みです、(?<=_)
はアンダースコアに一致します_
パターンの前。\d+
は1つ以上の数値と一致します。(?=)
は先読みです、(?=\.)
はドットに一致します.
パターンの後。全体の正規表現は、_
および.
選択する下線は最後のものなので:
変数を使用してファイル名を含める:
file=abc_asdfjhdsf_dfksfj_12345678.csv
n=${file%.*} # remove the extension `.csv`
n=${n#"${n%_*}_"} # remove up to the last underscore `_`
_
:"${n%_*}_"
n
の先頭から2から値を削除します:${n#value}
単に:
a=hjjhk_hkjh_asd_asd_sd_98765498.csv
pos1=${a%_*}
pos2=${a%.*}
echo ${a:${#pos1}+1:${#pos2}-${#pos1}-1}
last _のオフセットをpos1に取得します。lastのオフセットを取得します。 pos2の部分文字列を_オフセットからに変更します。オフセット
あなたは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