Regex 正确的bash sed命令语法以获得正确的子字符串
正在尝试从中获取子字符串: foo-bar-8568887b6f-d95wk 1/1运行0.48米 要获得一个:Regex 正确的bash sed命令语法以获得正确的子字符串,regex,bash,perl,sed,Regex,Bash,Perl,Sed,正在尝试从中获取子字符串: foo-bar-8568887b6f-d95wk 1/1运行0.48米 要获得一个: foo-bar-8568887b6f-d95wk 使用: sed's/^.\((foo-bar)[^\s]+\).$/\1/' 但是,这将返回整个字符串: foo-bar-8568887b6f-d95wk 1/1运行0.48m 在这种情况下,正确的sed命令是什么?有几个问题: 之后的^要求出现一个字符 POSIX BRE模式中的(foo-bar)匹配(foo-bar),但字符串中
foo-bar-8568887b6f-d95wk
使用:
sed's/^.\((foo-bar)[^\s]+\).$/\1/'
但是,这将返回整个字符串:
foo-bar-8568887b6f-d95wk 1/1运行0.48m
在这种情况下,正确的sed命令是什么?有几个问题:
之后的
要求出现一个字符^
- POSIX BRE模式中的
匹配(foo-bar)
,但字符串中没有括号(foo-bar)
- POSIX括号表达式中的
匹配的字符不是[^\s]
和\
,而是非空白字符s
- POSIX BRE模式中的
与+
字符匹配+
-抑制默认行输出-n
-替换命令s
//^.*\(foo-bar[^[:space:]*\).
foo-bar-匹配字符串的开头、任何0+字符,将
\1`)中,然后匹配字符串的其余部分和0个或更多除空格以外的字符捕获到组1(
-将整个匹配项替换为组1内容\1
-打印替换结果p
可选地,考虑如果在字符串的开始处总是期望匹配:<代码> AWK< /Cord>命令:
awk '$0 ~ /^foo-bar/{print $1}'
看。这意味着,如果行以
foo-bar
($0~/^foo-bar/
)awk
开头,将打印字段1(默认字段分隔符为空格,因此您将从开始到第一个空格获得子字符串)。[^\s]
匹配任何字符,但\
和s
,您需要[^[:空格:]*
或[^[:space:]\{1,\}
。此外,您的字符串不包含ncc full druid broker
目标是在foo bar
和第一个空格之间获得子字符串。在这里,您可以使用awk'$0~/^foo bar/{print$1}'
或sed-n's/^.\(foo bar[^[:space:]*\).$/\1/p'
好,这可以接受。为什么不只是awk'{print$1}
?如果你需要更多,那么你的问题可以提供一个更现实的例子。此外,很少有sed会将\s
识别为[[:space:][]
(可能只是GNU-sed)的缩写,如果他们这样做了,那么相反的将是\s
,而不是[^\s]
。顺便说一句,awk命令中不需要$0~
。
awk '$0 ~ /^foo-bar/{print $1}'