スペースなしで複数の単語を含む文字列の最初の単語を印刷するには?

スペースなしで複数の単語を含む文字列の最初の単語を印刷するには?

次のフォルダにappimageファイル名を印刷するシェルスクリプトがあります。

#! /bin/bash

Dir="$HOME/Applications/"
Dir2="$HOME/Downloads/"

cd -P "$Dir"
for f in *.AppImage; do
z=$(echo $f | head -n1 | awk '{print $1;}')
  echo $z
done

これで出力は次のようになります。

Altus-4.8.5-x86_64.AppImage
GitHubDesktop-linux-3.2.0-linux1.AppImage
webamp-desktop-0.3.0-x86_64.AppImage
YTDownloader.AppImage

出力が次のようになります。

Altus
GitHubDesktop-linux
webamp-desktop
YTDownloader

どうすればいいですか?

答え1

サフィックスを削除するには%

for f in *.AppImage; do
  f=${f%.AppImage}
  echo "${f%%-[0-9]*}"
done

答え2

以下を使用しますsed(ファイル名に改行文字がないと仮定します)。

printf '%s\n' "$fileName" |
sed -E 's/(-[0-9].*)?\.AppImage//' 

答え3

GNUの使用grep:

<INTPUT> | grep -oP '^\D+(?=-\d|\.)' 

使用Perl:

<INPUT> | perl -nE 'say $& if /^\D+(?=-\d|\.)/' 

出力

Altus
GitHubDesktop-linux
webamp-desktop
YTDownloader

正規表現の一致は次のとおりです。

正規表現 説明する
^\D+ 正規表現の先頭で、数字以外の1文字以上の文字と一致します。
(?=-\d|\.) 選択に含めずにハイフン、数字、ピリオドを一致させようとするプレビューを実行します。

答え4

ファイル名に改行が含まれていないとし、awk を使用します。

printf '%s\n' *.AppImage | awk -F'[.]|-[0-9]' '{print $1}'

改行文字を含めることができる場合は、GNU awkまたはRSにNULを使用できる他のバージョンを使用してください。

printf '%s\0' *.AppImage | awk F'[.]|-[0-9]' 'BEGIN{RS=ORS="\0"} {print $1}'

関連情報