Regex 正确的bash sed命令语法以获得正确的子字符串

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 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)
    ,但字符串中没有括号
  • POSIX括号表达式中的
    [^\s]
    匹配的字符不是
    \
    s
    ,而是非空白字符
  • POSIX BRE模式中的
    +
    +
    字符匹配
使用

这里,

  • -n
    -抑制默认行输出
  • s
    -替换命令
  • /^.*\(foo-bar[^[:space:]*\).
    /
    -匹配字符串的开头、任何0+字符,将
    foo-bar
    和0个或更多除空格以外的字符捕获到组1(
    \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}'