【问题标题】:Splitting strings for appname and version拆分应用名称和版本的字符串
【发布时间】:2022-01-24 23:38:33
【问题描述】:

我有一个文件,里面有几个字符串。 喜欢:

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 grep


【解决方案1】:

bash:

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

输出:

应用名称,2021.12.24 应用名称2020,2021.12.23 app_name,2021.12.01 app_name2020,2021.12.02 应用程序名称,2021.11.10

见:The Stack Overflow Regular Expressions FAQ

【讨论】:

  • 这就是它,谢谢!
【解决方案2】:

简单的bash

#!/bin/bash

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

或者,使用sed 单行:

sed 's/\(.*\)-/\1,/' file

【讨论】:

  • 我正在尝试在脚本中使用 sed 单行,但由于“应用程序名称”中的 -,它不适用于最后一行。所以我把它改成了sed 's/\(.*\)-[0-9]/\1,/' 但是我错过了版本中的第一个“2”。任何想法如何更改 sed 命令?
  • @zeel 答案中的版本应与示例输入中的最后一行一起使用。 sed 's/\(.*\)-/\1,/' &lt;&lt;&lt; 'app-name-2021.11.10' 应该打印出 app-name,2021.11.10
  • 对不起,你是对的。搞砸了一些事情。如果该行是appname-2021.12.24-SNAPSHOT,您是否知道如何更改 sed 命令
  • @zeel sed 's/\(.*\)-\([0-9].*\)/\1,\2/'
  • 似乎总有人能想出一个例外。现在似乎有应用程序具有以下名称:app_name-22.20.0-beta-1-10。不幸的是,这不适用于命令,app_name-22.20.0-beta-1,10 是结果。也许我必须寻找从行尾到最后一个数字“-”作为版本进行检查的东西。
【解决方案3】:
$ sed 's/-\([^-]*\)$/,\1/' file
appname,2021.12.24
appname2020,2021.12.23
app_name,2021.12.01
app_name2020,2021.12.02
app-name,2021.11.10

【讨论】:

  • 那不行,看最后一行。
  • 已修复以处理这种情况。
  • 谢谢,它确实有效。知道我是否可以使用 sed 命令来解决这种情况? app_name-22.20.0-beta-1-10。我认为最好从行尾开始,将所有数字/字符grep到最后一个-作为版本?
  • 不客气。 Chameleon Questions 强烈反对。您应该提出一个后续问题,包括该问题以及您未包含在此问题中的任何其他输入格式,并描述如何识别您想要的单独部分并显示预期的输出。
  • 打开了一个后续问题:[link] stackoverflow.com/questions/70520201/… 感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
相关资源
最近更新 更多