mo0*_*206 9 regex bash shell grep
我正在使用curl和cut输出如下.
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-MAIN或HIX-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.
你可以使用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中本地完成,而无需启动另一个进程.