我有一个如下字符串:
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。
答案 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-]+)
。
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 demo和regex grpah:
模式详细信息
^
-字符串的开头([A-Za-z0-9-]*)
-捕获组#1(${BASH_REMATCH[1]}
将具有此值):0个或更多ASCII字母,数字或-
字符-
-连字符[0-9]
-一个数字。