
以下の形式のファイルがあります:
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
答え1
awkも使えます。
$ echo "abc_asdfjhdsf_dfksfj_12345678.csv" | awk -F'[_.]' '{print $4}'
12345678
フィールド区切り文字を または に設定します_
。.
次に、列番号 4 を印刷すると、目的の結果が得られます ($(NF-1)
の代わりに (最後のフィールド) を使用することもできます$4
)。
答え2
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
、最長一致するパターンフロントエンド。
見るこのような参考文献パラメータ拡張の詳細については、こちらをご覧ください。
ファイル名のリストがテキスト ストリーム上にあり、1 行に 1 つのファイル名がある場合:
sed -n 's/.*_\(.*\)\..*/\1/p'
答え3
GNU を使うことができますgrep
:
$ echo abc_asdfjhdsf_dfksfj_12345678.csv | grep -oP '(?<=_)\d+(?=\.)'
12345678
説明
(?<=)
後読み、パターンの前の(?<=_)
アンダースコアに一致します_
。\d+
1 つ以上の数字と一致します。(?=)
先読みであり、パターンの後の(?=\.)
ドットに一致します。.
正規表現全体は、_
との間に含まれるすべてのものに一致することを意味します。.
答え4
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