【问题标题】:Bash get text between 5th and 6th underscore in a variableBash 获取变量中第 5 到第 6 个下划线之间的文本
【发布时间】:2019-11-05 22:37:58
【问题描述】:

我有一个名为$folder_name 的变量,其中包含字符串

Release_2019_Config_V6_Standalone_PJ6678_Test

这是一个文件夹的名称。 我正在尝试从文件夹名称中提取PJ6678。 我知道文件夹名称会将用户 ID(我需要的文本)放在第 5 个和第 6 个下划线之间,我不知道第 6 个下划线之后会出现什么文本/符号。

我正在使用 Bash 脚本,如果有人可以帮助我使用此功能,我将非常感谢您的帮助,因为我在尝试使用 sed 时完全迷失了(在阅读了几个小时后,我假设这是正确的工具)工作?

【问题讨论】:

  • 使用cut,分隔符设置为_。你可以用sed来做,但如果它总是在第5个和第6个下划线之间,那么就用cut吧。

标签: bash sed


【解决方案1】:

这是一个仅限 Bash 的解决方案:

#!/bin/bash
INPUT="Release_2019_Config_V6_Standalone_PJ6678_Test"
IFS='_' read -ra IN <<< "$INPUT"
echo ${IN[5]}

或者使用剪切:

cut -d '_' -f 6 <<< "Release_2019_Config_V6_Standalone_PJ6678_Test"

或者使用awk:

awk -F "_" '{ print $6 }' <<< "Release_2019_Config_V6_Standalone_PJ6678_Test"

【讨论】:

  • 感谢大家的帮助,非常感谢。 cut -d '_' -f 6
【解决方案2】:

如果你想要纯 bash 解决方案,你可以使用 tokenize 文件名,并选择第 5 个元素

IFS=_ read -a token <<< "$folder_name"
id=${token[5]}

消除对每个文件夹名称启动额外程序的依赖性和性能损失。

【讨论】:

  • @stephanmg - 无意伤害,这种情况经常发生,尤其是在新发布的问题上
  • 是的,我不确定政策是什么。是否应该删除类似的答案?
  • @stephanmg 我不确定这张票是否值得花时间。这只对“高流量票”很重要。
  • 如果我在第一次发布后的几分钟内发布了我自己的近乎重复的内容,我将删除它。基本上,我问自己“在我发布自己的答案之前,我真的没有机会看到第一个答案吗?”并尝试使用我最好的判断。如果我看到两个几乎相同的答案,如果它们相隔不超过几分钟,我同样会赞成两者(就像我在这里所做的那样);否则,我只支持第一个(但不要惩罚迟到的答案,但如果特别晚,我可能会评论它的重复状态)。
  • 我也会尝试遵循这个过程@chepner。谢谢。
【解决方案3】:

试试这个命令:

echo $a | awk -F'_'  '{print $6}'

这里,_ 是分隔符,$a 是保存值的变量。

【讨论】:

  • 这是什么意思?@stephanmg
【解决方案4】:

为了完整起见,这里有一个纯 shell 解决方案,它不依赖于数组之类的 bash 扩展。

$ folder_name=Release_2019_Config_V6_Standalone_PJ6678_Test
$ tmp=${folder_name#*_*_*_*_*_}  # Because we know how many _ to strip
$ echo ${tmp%_*}
PJ6678

因为# 运算符去掉了shortest 前缀,这将不允许* 匹配任何_ 本身;如果是这样,我们可以通过使下划线匹配模式中的文字 _ 之一来缩短前缀。

【讨论】:

  • 这是一个巧妙的技巧!感谢您发布此信息。 (我知道 # 和 % 运算符,但没想到以这种方式组合它们)。 +1!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 2018-03-17
  • 1970-01-01
  • 2020-10-10
  • 2022-01-06
  • 1970-01-01
  • 2012-01-29
相关资源
最近更新 更多