最後のアンダースコア文字で文字列を切り取る方法は?

最後のアンダースコア文字で文字列を切り取る方法は?

次のファイルのリストがあります。

[root@ods1 backup]# ls -l
total 93892810
-rw-r----- 1 root root 651248 Feb 17 08:34  abc_def_g_17-02-2022.sql
-rw------- 1 root root 665248 Mar 23 08:46  bbc_23-03-2022.sql
-rw-r----- 1 root root 676992 Apr 04 16:52  zz_b_04-04-2022.sql

私が達成しなければならないことは次のとおりです。

abc_def_g
bbc
zz_b

私は成功せずにこれを試しました。

ls -l | awk '{print $9}' | cut -d '_' -f1-2

この目標をどのように達成できますか?最後の行まで一連のコマンドを取得します。_キャラクターは職業に依存しなければなりません。

編集:このコマンドはCentOS 8で実行されます。

ベストアンサー1

到着解析されないlsloop、シンプルで構文を使用できますshell

for f in *; do echo "${f%_*}"; done

リストをさらに処理する必要がある場合(および配列で作業できるシェルがある場合)、項目を配列に追加できます。

tokens=()
for f in *; do tokens=("${tokens[@]}" "${f%_*}"); done
echo "${tokens[@]}"

あるいは、ループを使わずに配列を直接宣言します。

files=(*)
tokens=("${files[@]%_*}")
#or
for token in "${files[@]%_*}"; do echo "$token"; done

おすすめ記事