【发布时间】:2021-02-02 07:28:00
【问题描述】:
我看到了
How to use sed to replace only the first occurrence in a file?
如何做我想做的大部分事情:
sed -n '0,/.*\(something\).*/s//\1/p'
这会找到某事物的第一个匹配项并提取它(当然我的真实示例更复杂)。我知道 sed 有一个 'quit' 命令可以使其提前停止,但我不知道如何将 'q' 与上述行结合起来以获得我想要的行为。
正如我在一些示例中看到的那样,我尝试将“p”替换为 {p;q;},但这显然不起作用。
【问题讨论】:
-
你能更多地展示你正在得到什么、你想要什么以及它们有何不同吗?我做了
echo -e "aaa 111 aaa\nbbb 111 bbb"|sed -n '0,/.*\(111\).*/s//\1/p'并得到了一个“111”。然后我做了echo -e "aaa 111 aaa\nbbb 111 bbb"|sed -n '0,/\(.*\(111\).*\)/s//\1/p'来显示完整的行以确保它得到了什么,它输出“aaa 111 aaa”,这是我所期望的。请注意,我没有使用q。它是如何对您“不起作用”的。 -
您的方法会生成正确的输出,但即使没有更多工作要做,它也会继续处理整个文件,这对于大型文件或在管道中使用时很糟糕。我的具体用例是通过 git-p4 导入树上的“git log”找出最后一次提交使用了哪个 perforce 分支。 git log (当没有 -n 调用时,将记录每次发生的每一次提交(对我来说是数十万次)。我们无法先验地知道给 git '-n' 赋予什么价值。我的解决方案是:git log | sed -n '0,/.*[git-p4:.*\/\/depot\/blah\/([^\/]*)\/.*/s//\1/p; /[git- p4/q'
标签: sed