尝试从以下位置获取子字符串:
foo-bar-8568887b6f-d95wk 1/1运行0 48m
获得:
foo-bar-8568887b6f-d95wk
使用:
sed 's/^.\((foo-bar)[^\s]+\).*$/\1/'
但是这将返回整个字符串:
foo-bar-8568887b6f-d95wk 1/1 Running 0 48m
在这种情况下正确的sed命令是什么?
答案 0 :(得分:3)
有两个问题:
.
之后的^
需要一个字符出现(foo-bar)
与(foo-bar)
匹配,但是字符串中没有括号[^\s]
与\
和s
以外的其他字符匹配,而不是非空白char +
与一个+
字符匹配。使用
sed -n 's/^.*\(foo-bar[^[:space:]]*\).*/\1/p'
在这里
-n
-取消默认行输出s
-替换命令/^.*\(foo-bar[^[:space:]]*\).*
/ - matches start of the string, any 0+ chars, captures
foo-bar and 0 or more chars other than whitespace into Group 1 (
\ 1`),然后匹配其余字符串\1
-用第1组内容替换整个比赛p
-打印替换结果。或者,考虑一个awk
命令,如果总是期望在字符串的开头进行匹配,该命令将起作用:
awk '$0 ~ /^foo-bar/{print $1}'
请参见online demo。这意味着,如果该行以foo-bar
($0 ~ /^foo-bar/
)开头,awk
将打印字段1(默认字段分隔符为空格,因此您将从头开始获得子字符串,直到第一个空格)。