sed - sed 模式匹配,在第一个找到的字符处停止
问题描述
取字符串“hello_world 1 2 3”
我希望输出为“hello_world”
我的尝试是“s/\(.*\) .*/\1/g”
但我得到“hello_world 1 2”
它不是在序列后的第一个空格处停止,而是在该行的最后一个空格处停止。
我想取任意长度的字符 \(.*\) 后跟一个空格 ' ' 并删除它后面的任何内容。*
我该怎么做?
解决方案
请您尝试以下操作。
echo "hello_world 1 2 3" | sed 's/\([^ ]*\).*/\1/'
上面的解释:
使用sed
将匹配的正则表达式存储到临时缓冲区中的能力。稍后可以通过诸如 等变量访问1
(2
取决于您提到的缓冲区数量)。
在这里,我们捕获所有内容,直到第一个空间出现到第一个临时缓冲区中,然后保持一切原样.*
。在替换时,我们在\1
这里提到这意味着用第一个临时缓冲区(即 )的第一个匹配/存储的值替换整行的值hello_world
。
为什么 OP 的代码不起作用:因为 OP 使用.*
它是一个贪婪匹配的正则表达式并捕获第一个缓冲区本身中的所有行,这就是为什么当它使用\1
它实际打印整行时。
推荐阅读
- android - build.gradle中testImplementation和androidTestImplementation之间的android区别
- c++ - 使用 task_group 的英特尔线程构建模块性能不佳(新用户)
- android - Kotlin - Android 中的自定义对话框
- php - 将 mySQL 查询转换为 QueryBuilder
- optaplanner - 使用 OptaPlanner 的复合任务
- javascript - Electron 在更新组件样式时意外工作
- asp.net-core - ASP.NET Core:未找到 global.json 版本 2.1.400 的兼容 SDK 版本
- java - 从 Java Async 调用 Kotlin 代码
- php - ffmpeg 在终端中工作,但不在 php 中
- typescript - Typescript 对象属性类型