如何匹配,直到bash shell中最后一个字符出现

mo0*_*206 9 regex bash shell grep

我正在使用curlcut输出如下.

var=$(curl https://avc.com/actuator/info | tr '"' '\n' | grep - | head -n1 | cut -d'-' -f -1, -3)
Run Code Online (Sandbox Code Playgroud)

Varible var有两种值(一次一个).

HIX_MAIN-7ae526629f6939f717165c526dad3b7f0819d85b
HIX-R1-1-3b5126629f67892110165c524gbc5d5g1808c9b5
Run Code Online (Sandbox Code Playgroud)

我实际上是想把所有东西都拿到最后' - '.即HIX-MAINHIX-R1-1.

显示的命令可以正常工作HIX-R1-1.

但是当我-在变量中只有一个类似的东西时,我认为这是错误的做法; 它让我获得整个变量值(例如HIX_MAIN-7ae526629f6939f717165c526dad3b7f0819d85b).

如何将变量中的最后一个' - '变为现实var

Joh*_*024 13

这将删除从最后-到结尾的所有内容:

sed 's/\(.*\)-.*/\1/'
Run Code Online (Sandbox Code Playgroud)

例如:

$ echo HIX_MAIN-7ae52 | sed 's/\(.*\)-.*/\1/'
HIX_MAIN
$ echo HIX-R1-1-3b5126629f67 | sed 's/\(.*\)-.*/\1/'
HIX-R1-1
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

sed的替换命令的形式为s/old/new/,其中old是正则表达式.在这种情况下,正则表达式是\(.*\)-.*.这是因为\(.*\)-贪婪:它会匹配到最后一切-.由于逃脱的parens,\(...\)在最后一个之前的所有内容都-将保存在我们可以称为的第1组中\1.决赛将.*比赛结束后的所有内容-.因此,只要该行包含a -,此正则表达式匹配整行,而替换命令将替换整行\1.


Jef*_*ica 8

你可以使用bash字符串操作:

$ foo=a-b-c-def-ghi
$ echo "${foo%-*}"
a-b-c-def
Run Code Online (Sandbox Code Playgroud)

运营商,#%是对两侧的$QWERTY键盘,这有助于记住它们是如何修改的变量上:

  • #pattern 修剪匹配"模式"的最短前缀.
  • ##pattern 修剪与"模式"匹配的最长前缀.
  • %pattern 修剪与"模式"匹配的最短后缀.
  • %%pattern 修剪与"模式"匹配的最长后缀.

其中pattern匹配bash模式匹配规则,包括?(一个字符)和*(零个或多个字符).

在这里,我们正在修剪与模式匹配的最短后缀-*,这样${foo%-*}就可以得到你想要的东西.

当然,有很多方法可以使用awk或者sed可能重用sed您已经运行的命令.但是,可变操作可以在bash中本地完成,而无需启动另一个进程.