如何打印包含多个单词的字符串中的第一个单词而不带空格?

如何打印包含多个单词的字符串中的第一个单词而不带空格?

我有一个 shell 脚本来打印像这样的文件夹中的 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}'

相关内容