【问题标题】:version and pkgname extraction版本和 pkgname 提取
【发布时间】:2018-11-20 19:03:33
【问题描述】:

我在 bash 脚本中有以下变量。

xyz-0.3.2-3
abc-xyz-tools-0.1-1
def-yz-7.3.0-1.0.0

结果应该是:

pkg: xyz and version of xyz : 0.3.2-3
pkg: abc-xyz-tools version of abc-xzy-tools: 0.1-1
pkg: def-yz version of def-yz: 7.3.0-1.0.0

由于 pkg 名称具有不同的字长和版本 有不同的长度,这有点棘手。

您的帮助将不胜感激。 (bash、sed、awk 是首选语言)

【问题讨论】:

  • 欢迎来到 SO,请在您的帖子中发布正确的输入示例和正确的输出示例,然后让我们知道。
  • 输入样本:xyz-0.3.2-3 输出样本:xyz, 0.3.2-3 输入样本:abc-xyz-tools-0.1-1 输出样本:abc-xzy-tools, 0.1 -1
  • 抱歉,这不是 StackOverflow 的工作方式。 “我想做 X,请给我提示和/或示例代码”形式的问题被认为是题外话。请访问help center并阅读How to Ask,尤其是阅读Why is “Can someone help me?” not an actual question?
  • 有网址可以编辑吗?我想学习一下。
  • @user2754691,到目前为止,我已经为您进行了编辑,请确保您的示例始终包含在代码标签中,一个按钮 {} 也始终向我们展示您为展示您的问题所做的努力。跨度>

标签: string bash awk sed


【解决方案1】:

编辑:带有包名代码。

awk --re-interval '
match($0,/([a-zA-Z]+\-+){1,}/){
  val=substr($0,RSTART,RLENGTH-1);
  print "pkg: " val " and version of " val " : " substr($0,RSTART+RLENGTH)
}'  Input_file

您能否尝试关注awk,如果这对您有帮助,请告诉我。(如果您有更新版本的awk,请删除awk)。

awk --re-interval 'match($0,/([a-zA-Z]+\-+){1,}/){print substr($0,RSTART+RLENGTH)}' Input_file

【讨论】:

  • 非常感谢。肯定会正确打印版本号,而不是 pkg 名称本身。
  • @user2754691,请务必立即查看我的编辑代码,并尝试对试图帮助您的人进行投票,并尝试在答案中选择正确的答案以完全关闭线程。
【解决方案2】:

sed

$ sed -E 's/([a-z-]+)-([^-]+-[^-]+$)/package: \1\tversion: \2/' file |
  column -ts$'\t'

package: xyz            version: 0.3.2-3
package: abc-xyz-tools  version: 0.1-1
package: def-yz         version: 7.3.0-1.0.0

第二个捕获组用于捕获连字符周围的最后两个标记。第一个捕获组在倒数第二个之前都是字母和连字符。

【讨论】:

  • 非常感谢。所以我想更好地理解这一点。对于 \1 中的匹配字符串,正则表达式的后半部分是做什么的?在看到数字之前,您正在匹配任何与 [a-z-]+ 的内容?
  • 是的,我现在明白了。谢谢。需要更好地理解这个组匹配。
猜你喜欢
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2020-11-17
  • 2018-07-04
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
相关资源
最近更新 更多