拆分应用程序名称和版本的字符串

Splitting strings for appname and version

我有一个包含几个字符串的文件。 喜欢:

appname-2021.12.24
appname2020-2021.12.23
app_name-2021.12.01
app_name2020-2021.12.02
app-name-2021.11.10

我想要这些字符串中的应用程序名称和版本在单个变量中,这样我就可以从我的脚本中输出一个 csv 文件 在这种情况下:

appname,2021.12.24
appname2020,2021.12.23
app_name,2021.12.01
app_name2020,2021.12.02
app-name,2021.11.10

版本始终是带点的子字符串,前面有 -。

我的想法是将名称和版本放在一个单独的变量中,并最终将其合并到一个带有额外逗号的新变量中

string = $appname","$appversion

我试过将 cut 与 - 分隔符一起使用,但这不适用于示例 5。 使用 grep -Eo “[a-zA-Z_]+” 也不起作用,缺少示例 2 中的 2020.

是否可以找到从行尾到第一行的所有歌曲和点?

bash:

while read -r line; do
  if [[ "$line" =~ (.*)-([^-]+)$ ]]; then
    string="${BASH_REMATCH[1]},${BASH_REMATCH[2]}"
    echo "$string"
  fi
done < file

输出:

appname,2021.12.24
appname2020,2021.12.23
app_name,2021.12.01
app_name2020,2021.12.02
app-name,2021.11.10

参见:The Stack Overflow Regular Expressions FAQ

简而言之bash:

#!/bin/bash

while read -r line; do
    printf '%s,%s\n' "${line%-*}" "${line##*-}"
done < file

或者,使用 sed 一行:

sed 's/\(.*\)-/,/' file
$ sed 's/-\([^-]*\)$/,/' file
appname,2021.12.24
appname2020,2021.12.23
app_name,2021.12.01
app_name2020,2021.12.02
app-name,2021.11.10