我需要使用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
业务弄好。
答案 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/'