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

标签 regex bash perl sed

尝试从 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/

相关文章:

javascript - 如何使用 javascript 正则表达式替换为单词的子字符串

linux - 正则表达式在通过 ssh 的 sed 中不被接受

linux - Awk 检查文件 1 中 column1 的值是否存在于 file2 中并更新另一列中的字段

ruby - 使用 ruby​​ 或 perl 解析 C_ISAM 文件

arrays - 有没有一种方法可以根据数组的值而不是元素编号用数组中的两个新元素替换数组的元素?

c# - RegEx、StringBuilder 和大对象堆碎片

sql - Postgres : Select the maximum integer substring of a column value

java - 用于匹配具有非法文件名字符的字符串的正则表达式

linux - 如何对以减号开头且包含空格的文件执行 sh 脚本?

bash - 如何使用packer为bash脚本设置变量?