我想在一行的最后一个单词前面添加一个目录名称。该行具有以下格式:
100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0^IoneFile$
where ^I
表示一个tab
, and $
表示行尾。该行是由生成的git ls-files -s
.
我想要一个sed
前置命令one/
到这一行的文件名,如下所示:
`100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0^Ione/oneFile$
我尝试过的一些行及其相应的输出:
-
匹配最长的不存在的字符串\t
其次是$
;附加one/
:
$ git ls-files -s | sed 's|[^\t]*$|one/&|'
one/100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0 oneFile
-
匹配最长的不存在的字符串\t
or ' '
其次是$
;前置one/
:
$ git ls-files -s | sed 's|[^\t ]*$|one/&|'
100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e one/0 oneFile
-
匹配非水平空白的最长字符串,前置“one/”:
$ git ls-files -s | sed 's|[^[[:blank:]]]*$|one/&|'
100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0 oneFilone/e
我基本上尝试了一大堆匹配的东西:
[^\t ]*$|one/&
[^[[:space:]]]*$|one/&
以及上面列出的那些。我能得到的最接近的是oneFilone/e
,这是[^[[:blank:]]]*$|one/&|'
,或预先挂起0
,但我似乎无法完全得到我想要的。
编辑
因为有几个人评论/发布了答案,但这些答案都不适合我,我想我应该补充一下:我正在使用 Mac OS X 10.7.3。的版本sed
我不完全确定(如果有人知道如何获得它,请随意添加评论)-man sed
页面说它是 BSD sed。我不确定这有什么不同GNU sed
,如果有的话。
我也在用zsh
, with oh-my-zsh
正在运行(几乎没有修改)。我已开启extended_glob
(setopt extended_glob
).
我已经用我的结果对人们给出的答案进行了评论;我假设它们在 Linux 发行版上运行?今晚我无法访问非 OS X 系统,但明天我将重新运行所有答案;也许这只是我的[shell|OS|bad karma]
这不让他们为我工作。
再次编辑:
所以我在Ubuntu系统上进行了测试,上面的(1)确实有效。不过,我想要一个适用于我的 Mac 的工作版本。
最终编辑:
感谢所有使用等效命令回答的人。原来我的第一个does工作,但不与BSD sed
。然而我确实有gsed
可用(感谢您指出这一点!)这使得这些都神奇地发挥作用。