在bash中使用regexp获取字符串的子字符串

时间:2019-06-14 21:17:20

标签: regex linux bash

我有一个如下字符串:

my-name-is-yes-111111.maybe.text.here?-34.34.34

我想使用正则表达式捕获-[0-9]的第一个实例之前的所有文本,因此在这种情况下,我将得到:

my-name-is-yes

我将把它移植到ansible,因此它必须使用regexp而不是sed或awk或类似的东西。

我已经使用sed提出了一些建议,但同样,我需要regexp:

echo $x | rev |cut -d. -f6 | rev | sed -e 's/-[0-9]*$//g'
my-name-is-yes

问题在于这里的周期可能比。我需要切入的6。

4 个答案:

答案 0 :(得分:2)

您可以使用parameter expansion

$ str='my-name-is-yes-111111.maybe.text.here?-34.34.34'
$ echo "${str%%-[[:digit:]]*}"
my-name-is-yes

其中${parameter%%word} word 扩展的末尾删除 parameter 扩展到的模式的首字符匹配

答案 1 :(得分:2)

您可以使用shell参数扩展来解决您指定的测试用例。这是一个示例:

# var=my-name-is-yes-111111.maybe.text.here?-34.34.34
# echo ${var%%\-[0-9]*}
my-name-is-yes

如果您需要此变量,则可以分配扩展名,即

var=my-name-is-yes-111111.maybe.text.here?-34.34.34
var2=${var%%\-[0-9]*}
echo $var2
my-name-is-yes

您甚至可以用扩展值覆盖第一个值,

var=my-name-is-yes-111111.maybe.text.here?-34.34.34
var=${var%%\-[0-9]*}
echo $var
my-name-is-yes

%%%参数扩展运算符的含义是“从变量的右侧删除匹配值”,而%%的含义是从右侧删除最大匹配值。

还有###参数扩展运算符,它们执行相似的功能,但是“从变量值的左侧删除匹配的值。 IHTH

答案 2 :(得分:0)

可以在此处提取所需输出的表达式很简单:

([A-Za-z-]+)(-[0-9].+)

,我们所需的数据在以下捕获组中:([A-Za-z-]+)

Demo

建议

user3299633通过以下解决方案进行了简化:

if [[ $x =~ ([[:alnum:]-]+)(-[[:digit:]].+) ]]; then echo ${BASH_REMATCH[1]}; fi

答案 3 :(得分:0)

您可以使用:

s='my-name-is-yes-111111.maybe.text.here?-34.34.34'
regex='^([A-Za-z0-9-]*)-[0-9]'
if [[  "$s" =~ $regex ]]; then
  echo "${BASH_REMATCH[1]}";
else
  echo "No match!";
fi;

输出:my-name-is-yes

请参见Bash demoregex grpah

enter image description here

模式详细信息

  • ^-字符串的开头
  • ([A-Za-z0-9-]*)-捕获组#1(${BASH_REMATCH[1]}将具有此值):0个或更多ASCII字母,数字或-字符
  • --连字符
  • [0-9]-一个数字。