为什么sed正则表达式替换不起作用?

时间:2014-07-11 21:17:07

标签: regex bash sed

我需要使用sed做一些非常简单的事情:我需要从此字符串HEAD detached at 19d7ea9中获取提交哈希值。

以下是我使用sed

进行的尝试
echo "HEAD detached at 19d7ea9" | sed 's/HEAD\ detached\ at\ \(.\+\)/\1/'

但是,该命令不起作用,我无法弄清楚原因。我知道我可以像sed 's/HEAD\ detached\ at//那样做不同的结果。但我似乎无法弄清楚为什么第一种方法不起作用。

任何答案都将不胜感激。这是我第一次使用sed(我知道我迟到了),所以请忽略noobie的错误。


编辑:感谢所有答案。看起来使用-E标志是解决这个问题最直接的方法。

我尝试用另一个例子来关注@ ooga的回答,但这也失败了。再说一遍,我无法弄清楚我在做错了什么:

示例2: 我试图看看回购是在前面还是在远程后面,以及有多少提交。这是我的代码

status="On branch master Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits) Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to..."

echo $status | sed -E 's/Your branch is (ahead|behind).+([0-9]+) comm)/\2 \1/'

对此主题的任何进一步帮助表示赞赏。我想知道为什么我不能把这整个sed业务弄好。

3 个答案:

答案 0 :(得分:3)

使用带有-E标志的“扩展”(现代)正则表达式语法(在OSX上,或GNU上的-r标志)。这样你不仅拥有+量词,而且你不需要在它前面或括号中使用反斜杠。

sed -E 's/HEAD detached at (.+)/\1/'

答案 1 :(得分:2)

你得到了关于sed版本的答案,但是在awk中你只是告诉它打印行上最后一个以空格分隔的字段:

awk '{print $NF}' file

答案 2 :(得分:1)

+似乎不是POSIX Basic Regular Expression中的有效量词,但是*,因此以下工作,甚至可以移植到OS X.

echo "HEAD detached at 19d7ea9" | sed  's/HEAD detached at \(.*\)/\1/'