尝试从 a 中获取子字符串:
foo-bar-8568887b6f-d95wk 1/1 Running 0 48m
得到一个:
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 模式中的 +
匹配+
字符。
使用
sed -n 's/^.*\(foo-bar[^[:space:]]*\).*/\1/p'
在这里,
-n
- 抑制默认行输出s
- 替换命令/^.*\(foo-bar[^[:space:]]*\).*
/- 匹配字符串的开头,任何 0+ 个字符,捕获
foo-bar和除空格以外的 0 个或更多字符到第 1 组 (
\1`),然后匹配字符串的其余部分\1
- 用第 1 组内容替换整个匹配项p
- 打印替换结果。
或者,考虑一个 awk
命令,如果匹配总是期望在字符串的开头,该命令将起作用:
awk '$0 ~ /^foo-bar/{print $1}'
参见 online demo .这意味着如果该行以 foo-bar
($0 ~/^foo-bar/
) awk
开头,将打印字段 1(默认字段分隔符是空格,因此您将获得从开头到第一个空格的子字符串)。
关于regex - 更正 bash sed 命令语法以获得正确的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58994861/