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

时间:2019-11-22 13:02:18

标签: regex bash perl sed

尝试从以下位置获取子字符串:

  

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命令是什么?

1 个答案:

答案 0 :(得分:3)

有两个问题:

    .之后的
  • ^需要一个字符出现
  • POSIX BRE模式中的
  • (foo-bar)(foo-bar)匹配,但是字符串中没有括号
  • POSIX方括号表达式中的
  • [^\s]\s以外的其他字符匹配,而不是非空白char
  • POSIX BRE模式中的
  • +与一个+字符匹配。

使用

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(默认字段分隔符为空格,因此您将从头开始获得子字符串,直到第一个空格)。